0

如果另一个表中的一个值与另一个值匹配,但该值本身不是键,您如何防止 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

如何防止插入描述用户与其自己的用户数据有关系的插入?有了这些数据,在关系上插入后所需的结果将是:

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

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

4

1 回答 1

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

于 2013-08-22T02:14:57.230 回答