2013-08-22 74 views
0

如果在另一個表中有一個值與另一個表中的值匹配,但是該值本身不是鍵,那麼如何防止MySQL中的INSERT或UPDATE?答案必須是FOREIGN KEY約束,但我不確定它是如何處理多列和非關鍵字段的。MySQL防止用外鍵插入

我自己的情況是這樣的:

對於這個表USERDATA使用這些值:

ID | USER_ID | UUID 
1  29  aaa 
2  29  bbb 
3  30  ccc 

,並用INSERT後這些值,其中userdata_uuid裁判UUID和receiver_id裁判user_id說明

此表關係
ID | USERDATA_UUID | RECEIVER_ID 
1   aaa   29 
2   aaa   30 
3   bbb   29 
4   bbb   30 
5   ccc   29 
6   ccc   30 

我該如何防止描述用戶與他們自己的用戶數據有關係的插入?有了這些數據,在RELATIONS上插入後所需的結果是:

ID | USERDATA_UUID | RECEIVER_ID 
1   aaa   30 
2   bbb   30 
3   ccc   29 

希望這是有道理的,謝謝。

+0

關係中的哪些列是不可空的? – peterm

+0

我發佈的那些都是不可空的。 –

回答

1

你可以通過觸發器來實現這一點。

CREATE TRIGGER tg_bi_relations 
BEFORE INSERT ON relations 
FOR EACH ROW 
    SET NEW.userdata_uuid = IF(EXISTS(
     SELECT * 
     FROM userdata 
     WHERE uuid = NEW.userdata_uuid 
     AND user_id = NEW.receiver_id), NULL, NEW.userdata_uuid); 

CREATE TRIGGER tg_bu_relations 
BEFORE UPDATE ON relations 
FOR EACH ROW 
    SET NEW.userdata_uuid = IF(EXISTS(
     SELECT * 
     FROM userdata 
     WHERE uuid = NEW.userdata_uuid 
     AND user_id = NEW.receiver_id), NULL, NEW.userdata_uuid); 

訣竅是違反NOT NULL約束如果您的支票條件得到滿足。

這裏是SQLFiddle演示
嘗試取消註釋最後兩個INSERT和UPDATE語句一次一個。觸發器不會讓他們成功。

+0

這就是訣竅,非常感謝! –

+0

@CallumJenkins你非常歡迎。祝你好運 :) – peterm