2013-09-26 95 views
2

我有一張表,我使用複合鍵作爲主鍵。它創建類似:複合鍵「雙向」

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

BAR1和BAR2是FK:■對於其他表,我想,以確保始終有零或一個元組在我FOO表,其中同時存在這兩個鍵。 Basicaly我想它在同一時間是這樣的:

PRIMARY KEY (BAR2, BAR1) 

同時按鍵都必須被允許進行配對的任意次數與其它按鍵,使他們不能每個人是唯一的。

所以,當我做了

INSERT INTO FOO VALUES (1,2); 

架構將不允許

INSERT INTO FOO VALUES (2,1); 

什麼是在mysql中解決這個好辦法?

回答

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 
+0

還需要更新觸發器進行類似的檢查。 – sqlvogel

+0

@sqlvogel,由於bar1 + bar2被認爲是主鍵,所以從OP中不清楚應用是否更新了這個表,但我同意你的看法:如果更新發生,還需要更新觸發器。 –

+0

這在理論上似乎是合理的。當我嘗試創建建議的觸發器時,出現語法錯誤。 @sqlvogel:爲了說清楚,是的,應用程序更新了這張表。 –

2

我不確定我是否瞭解您的要求,但我認爲您需要以下其中一項。

  1. 確保只有一個BAR1/BAR2值的可能的配對可以在FOO存在:

    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)); 
    
+0

當然!我要求的是你的第一個答案。 –

+0

你試過了嗎? –

+3

在MySQL中「CHECK子句已解析但被所有存儲引擎忽略」http://dev.mysql.com/doc/refman/5.7/en/create-table.html – rsanchez