在删除时为 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
);
所以我很难理解为什么这个代码片段给我一个
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
);