MySQL 键约束
我有一个使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我最终使用了这样的语句:
如果嵌套选择不返回任何行,则只会插入一行。
I ended up using a statement like:
Which will only insert a row if the nested select returns no rows.
之类的东西怎么样?
如果存在(从 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;
?