带有删除集 null 的 DB2 外键不适用于引用父 table 同一列的两列
DB2 foreign key with on delete set null not working for two columns referencing same column of parent table
我有以下ddl
CREATE TABLE ABC (
COL1 INTEGER NOT NULL,
COL2 VARCHAR(100) NOT NULL,
COL3 VARCHAR(100) NOT NULL,
COL4 INTEGER NOT NULL
);
ALTER TABLE ABC
ADD CONSTRAINT ABC_PK PRIMARY KEY
(COL1,
COL4);
CREATE TABLE XYZ (
COL1 INTEGER NOT NULL,
COL2 INTEGER,
COL3 INTEGER,
COL4 INTEGER
);
ALTER TABLE XYZ
ADD CONSTRAINT COL_2_FK FOREIGN KEY
(COL2,
COL4)
REFERENCES ABC
(COL1,
COL4)
ON DELETE SET NULL
ON UPDATE NO ACTION
ENFORCED
ENABLE QUERY OPTIMIZATION;
ALTER TABLE XYZ
ADD CONSTRAINT COL_3_FK FOREIGN KEY
(COL3,
COL4)
REFERENCES ABC
(COL1,
COL4)
ON DELETE SET NULL
ON UPDATE NO ACTION
ENFORCED
ENABLE QUERY OPTIMIZATION;
最后一次更改 table 失败并出现以下错误:
FOREIGN KEY "COL_3_FK" is not valid because it would cause a descendent table "DB2ADMIN.X" to be delete-connected to its ancestor table "DB2ADMIN.A" through multiple relationships with conflicting delete rules. The conflict is between the delete rules of constraints "DB2ADMIN.XYZ.CO" and "DB2ADMIN.XYZ.COL_3_FK" on the descendent table. Reason code = "3".. SQLCODE=-20255, SQLSTATE=42915, DRIVER=3.68.61
我在 IBM DB2 文档中找到:
当一个 table 通过具有重叠外键的多个关系删除连接到另一个 table 时,这些关系必须具有相同的删除规则并且其中的 none 可以设置为空。
但我不明白背后的道理?
我该如何克服这个问题?
我认为原因很简单:COL_2_FK
的 SET NULL
删除规则导致受影响的行违反 COL_3_FK
(反之亦然)-- COL4
设置为 null,但它必须引用 ABC.COL4
中的有效值。至于如何克服这个问题——重新考虑你的约束(或模型)。
我有以下ddl
CREATE TABLE ABC (
COL1 INTEGER NOT NULL,
COL2 VARCHAR(100) NOT NULL,
COL3 VARCHAR(100) NOT NULL,
COL4 INTEGER NOT NULL
);
ALTER TABLE ABC
ADD CONSTRAINT ABC_PK PRIMARY KEY
(COL1,
COL4);
CREATE TABLE XYZ (
COL1 INTEGER NOT NULL,
COL2 INTEGER,
COL3 INTEGER,
COL4 INTEGER
);
ALTER TABLE XYZ
ADD CONSTRAINT COL_2_FK FOREIGN KEY
(COL2,
COL4)
REFERENCES ABC
(COL1,
COL4)
ON DELETE SET NULL
ON UPDATE NO ACTION
ENFORCED
ENABLE QUERY OPTIMIZATION;
ALTER TABLE XYZ
ADD CONSTRAINT COL_3_FK FOREIGN KEY
(COL3,
COL4)
REFERENCES ABC
(COL1,
COL4)
ON DELETE SET NULL
ON UPDATE NO ACTION
ENFORCED
ENABLE QUERY OPTIMIZATION;
最后一次更改 table 失败并出现以下错误:
FOREIGN KEY "COL_3_FK" is not valid because it would cause a descendent table "DB2ADMIN.X" to be delete-connected to its ancestor table "DB2ADMIN.A" through multiple relationships with conflicting delete rules. The conflict is between the delete rules of constraints "DB2ADMIN.XYZ.CO" and "DB2ADMIN.XYZ.COL_3_FK" on the descendent table. Reason code = "3".. SQLCODE=-20255, SQLSTATE=42915, DRIVER=3.68.61
我在 IBM DB2 文档中找到: 当一个 table 通过具有重叠外键的多个关系删除连接到另一个 table 时,这些关系必须具有相同的删除规则并且其中的 none 可以设置为空。
但我不明白背后的道理? 我该如何克服这个问题?
我认为原因很简单:COL_2_FK
的 SET NULL
删除规则导致受影响的行违反 COL_3_FK
(反之亦然)-- COL4
设置为 null,但它必须引用 ABC.COL4
中的有效值。至于如何克服这个问题——重新考虑你的约束(或模型)。