MySQL 键约束

发布于 2024-11-08 01:29:07 字数 412 浏览 4 评论 0原文

我有一个使用 InnoDB 引擎的 MySQL 表,其中包含两个字段:a(int)和 b(string)。

我想构造它,以便 b 的特定值可以在表中出现任意次数,但每次出现时,它必须始终与 a 的相同值一起出现,即假设我的表如下所示:

(a,b)
(1,'foo')
(2,'bar')
(2,'bar')
(2,'baz')

我应该能够成功插入 (1,'foo')、(2,'bar') 甚至 (2,'qux') 到表中,但插入 (2,'foo')、(1,'bar') 或(1,'baz') 应该失败,因为每当 b 的这些字符串值出现时,它们应该始终与 a 的相同值一起出现。

有什么想法可以有效地做到这一点吗?我一直在尝试事务和 SELECT ... FOR UPDATE ,但没有运气。我的表结构是否错误?

I've got a MySQL table with, among other things, two fields: a (int) and b (string) using the InnoDB engine.

I want to structure it so that a particular value of b can appear an arbitrary number of times in the table but every time it appears it must always appear with the same value of a, i.e. suppose my table looks like this:

(a,b)
(1,'foo')
(2,'bar')
(2,'bar')
(2,'baz')

I should be able to successfully insert (1,'foo'), (2,'bar') or even (2,'qux') into the table, but inserts of (2,'foo'), (1,'bar') or (1,'baz') should fail because whenever those string values of b appear they should always appear with the same value of a.

Any ideas how to do this efficiently? I've been playing around with transactions and SELECT ... FOR UPDATE but no luck. Do I have the wrong table structure?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

来世叙缘 2024-11-15 01:29:07

我最终使用了这样的语句:

 INSERT INTO mytable(`a`,`b`) SELECT 1,'foo' FROM dual WHERE NOT EXISTS
 (SELECT * FROM mytable WHERE a != 1 AND b = 'foo')

如果嵌套选择不返回任何行,则只会插入一行。

I ended up using a statement like:

 INSERT INTO mytable(`a`,`b`) SELECT 1,'foo' FROM dual WHERE NOT EXISTS
 (SELECT * FROM mytable WHERE a != 1 AND b = 'foo')

Which will only insert a row if the nested select returns no rows.

扭转时空 2024-11-15 01:29:07

之类的东西怎么样?

如果存在(从 mytable 中选择 null,其中 a!=prm_a 和 b=prm_b)
插入...
别的
增加
结尾;

what about somthing like

if exists (select null from mytable where a!=prm_a and b=prm_b) then
insert into ...
else
raise
end;

?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文