【问题标题】:on delete set null constraint on null field for c:n with combined PKon delete set null 对 c:n 组合 PK 的 null 字段的约束
【发布时间】:2017-06-12 17:27:50
【问题描述】:

所以我很难理解为什么这段代码 sn-p 给了我一个 Error: 150 "Foreign key constraint is incorrectly formed"尝试创建 FK 时

CREATE TABLE T1 (
  t1ID INT AUTO_INCREMENT,
  /* ... unrelated columns */
  PRIMARY KEY (t1ID)
);

CREATE TABLE T2 (
  t3fk INT NOT NULL,
  t1fk INT,
  /* ... unrelated columns */
  CONSTRAINT t2ID PRIMARY KEY (t3fk,t1fk),
  FOREIGN KEY (t1fk) REFERENCES T1(t1ID) ON DELETE SET NULL
);

我要做的是在 t1 和 t2 之间创建 c:n 关系,其中 t2 具有组合 PK,其中 (t3fk:null) 是有效标识符

我已经搜索了很长一段时间的答案,但我只找到这样的结果,其中 FK 列设置为不接受空值:

MySQL - Foreign key on delete set null in not null field

MySQL: error 150 using ON UPDATE SET NULL and ON DELETE SET NULL, why?

我正在使用 InnoDB。

感谢您的关注(也欢迎对未来的问题提供反馈)

【问题讨论】:

    标签: mysql sql constraints innodb


    【解决方案1】:

    发生这种情况只是因为您将 t1fk 设置为表 t2 中主键的一部分,并且主键必须是 UNIQUE & NOT NULL。如果您删除引用的值,您将拥有 (t3fk:null) ,但这是不可能的。你认为你有以下数据

    T1    t1ID   5
          t1ID   6
          t1ID   7
    T2    t3fk  2
          t1fk  5
    
     T2   t3fk 2
          t1fk 6
    

    如果您从 t1 中删除数字 5 和 6,您将在 t2 中拥有具有相同值 (2,null) 的两行,这是不可能的,因为它是一个必须是唯一且非 NULL 的主键。

    如果 t1ID 是主键的一部分,则不能让它为空。

    要解决这个问题,您可以创建一个人工主键(自动增量),然后以这种方式创建一个允许 (t3fk,t1fk) 重复的键

    CREATE TABLE T1 (
      t1ID INT AUTO_INCREMENT,
      /* ... unrelated columns */
      PRIMARY KEY (t1ID)
    );
    
    CREATE TABLE T2 (
      t2fk int auto_increment,
      t3fk INT NOT NULL,
      t1fk INT,
      /* ... unrelated columns */
      CONSTRAINT t2ID primary key (t2fk),
      KEY (t3fk,t1fk),
      FOREIGN KEY (t1fk) REFERENCES T1(t1ID) ON DELETE SET NULL
    );
    

    【讨论】:

    • 有道理,谢谢 - 您能否详细说明 c:n 解决方案的建议解决方案是什么? (可能是创建一个人工密钥?)
    • @Simon 我修改了我的答案,所以你有办法解决它
    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2012-04-14
    相关资源
    最近更新 更多