在删除时为 c:n 的空字段设置空约束与组合 PK

on delete set null constraint on null field for c:n with combined PK

所以我很难理解为什么这个代码片段给我一个 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。

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

发生这种情况只是因为您将 t1fk 设置为 table 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),这是不可能的,因为它是一个主键,必须是唯一的而不是唯一的空。

如果 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
);