使复合键“双向”

时间:2013-09-26 21:50:59

标签: mysql sql database-design composite-key

我有一张表,我使用复合键作为主键。它的创建类似于:

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中解决这个问题的好方法是什么?

2 个答案:

答案 0 :(得分:2)

我不确定我是否了解您的要求,但我认为您需要以下其中一项。

  1. 确保FOO中只存在一个可能的BAR1 / BAR2值配对:

    CREATE TABLE FOO(
        BAR1 INT,
        BAR2 INT,
    CHECK (BAR1<=BAR2),
    PRIMARY KEY (BAR1, BAR2));
    
  2. 确保两个配对必须始终存在:

    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