【问题标题】:MySQL preventing insert with foreign keyMySQL防止使用外键插入
【发布时间】:2013-08-22 01:07:41
【问题描述】:

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

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

【问题讨论】:

  • 关系中的哪些列不可为空?
  • 我发的都是不可为空的。

标签: mysql insert foreign-keys


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

【讨论】:

    猜你喜欢
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    相关资源
    最近更新 更多