所以我很难理解为什么这段代码会给我一个
尝试创建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。
感谢您的关注(欢迎回复以后的问题)
答案 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
);