如果另一个表中的一个值与另一个表中的值匹配,那么如何阻止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
希望这是有道理的,谢谢。
答案 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 演示版 尝试一次取消注释两个最后一个插入和更新语句。触发器不会让它们成功。