我有一张表,我使用复合键作为主键。它的创建类似于:
CREATE TABLE FOO(
BAR1 INT,
BAR2 INT,
PRIMARY KEY (BAR1, BAR2))
对于其他表格,BAR1和BAR2是FK:s,我想确保在我的FOO表中始终存在零个或一个元组,其中这两个键同时存在。 Basicaly我希望它同时像:
PRIMARY KEY (BAR2, BAR1)
同时,必须允许密钥与其他密钥配对任意次数,因此它们不能是唯一的。
所以当我完成了
INSERT INTO FOO VALUES (1,2);
架构将禁止
INSERT INTO FOO VALUES (2,1);
在mysql中解决这个问题的好方法是什么?
答案 0 :(得分:2)
我不确定我是否了解您的要求,但我认为您需要以下其中一项。
确保FOO中只存在一个可能的BAR1 / BAR2值配对:
CREATE TABLE FOO(
BAR1 INT,
BAR2 INT,
CHECK (BAR1<=BAR2),
PRIMARY KEY (BAR1, BAR2));
确保两个配对必须始终存在:
CREATE TABLE FOO(
BAR1 INT,
BAR2 INT,
FOREIGN KEY (BAR2, BAR1) REFERENCES FOO (BAR1, BAR2),
PRIMARY KEY (BAR1, BAR2));
答案 1 :(得分:2)
可能的解决方案是使用触发器。
create trigger bi_foo before insert on foo
for each row
begin
if exists(select 1 from foo where bar1 = NEW.bar2 and bar2 = NEW.bar1)
then
signal sqlstate '50000' set message_text="Oops";
end if;
end
这将有效:
insert into foo values (1, 2), (3, 4), (5, 6);
insert into foo values (3, 2), (3, 5), (1, 6);
这将失败:
mysql> insert into foo values (2, 1);
ERROR 1644 (50000): Oops