2

我有一个表,我使用复合键作为主键。它创造了类似的东西:

CREATE TABLE FOO(
    BAR1 INT,
    BAR2 INT,
PRIMARY KEY (BAR1, BAR2)) 

BAR1 和 BAR2 是其他表的 FK:s,我想确保我的 FOO 表中总是有零个或一个元组,其中这两个键同时存在。基本上我希望它同时像:

PRIMARY KEY (BAR2, BAR1)

同时,必须允许密钥与其他密钥任意次数配对,因此它们不能每个都是唯一的。

所以当我完成

INSERT INTO FOO VALUES (1,2); 

架构将不允许

INSERT INTO FOO VALUES (2,1);

在mysql中解决这个问题的好方法是什么?

4

2 回答 2

3

一个可能的解决方案是使用触发器。

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
于 2013-09-26T22:56:02.450 回答
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));
    
于 2013-09-26T22:32:40.907 回答