带有删除集 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_FKSET NULL 删除规则导致受影响的行违反 COL_3_FK(反之亦然)-- COL4设置为 null,但它必须引用 ABC.COL4 中的有效值。至于如何克服这个问题——重新考虑你的约束(或模型)。