对于c:n,使用组合PK,在null字段上设置null约束

时间:2017-06-12 17:27:51

标签: mysql sql constraints innodb

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

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。

感谢您的关注(欢迎回复以后的问题)

1 个答案:

答案 0 :(得分:0)

这只是因为您将t1fk设置为表t2中主键的一部分,并且主键必须是UNIQUE&不是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
);