所以我很难理解为什么这个代码片段给了我一个 尝试创建 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 - 删除上的外键在非空字段中设置为空
MySQL:错误 150 使用更新集空和删除集空,为什么?
我正在使用InnoDB。
感谢您的关注(也欢迎对以后的问题提供反馈(
发生这种情况只是因为您将 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
);