MySQL防止插入外键

时间:2013-08-22 01:07:42

标签: mysql insert foreign-keys

如果另一个表中的一个值与另一个表中的值匹配,那么如何阻止MySQL中的INSERT或UPDATE,但该值本身不是键?答案必须是FOREIGN KEY约束,但我不确定它如何适用于多列以及非关键字段。

我自己的情况是这样的:

鉴于此表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

如何防止描述用户与其自己的用户数据有关系的插入?有了这些数据,INSERT on RELATIONS之后的期望结果将是:

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

希望这是有道理的,谢谢。

1 个答案:

答案 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 演示版 尝试一次取消注释两个最后一个插入和更新语句。触发器不会让它们成功。