Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql DB2:多个表之间的外键约束_Sql_Postgresql_Db2_Ddl - Fatal编程技术网

Sql DB2:多个表之间的外键约束

Sql DB2:多个表之间的外键约束,sql,postgresql,db2,ddl,Sql,Postgresql,Db2,Ddl,在DB2中,假设我有3个表:T1、T2、T3: 我希望定义FK关系时,如果T3中有连接的记录,它将禁止删除T2中的记录,但同时当我从T1中删除记录时,它将分别自动删除T2和T3中的记录 是否可以仅定义FK约束来满足这些要求?或者,如果不编写一个代码,首先从T3中删除相应的记录,然后从T2中删除相应的记录,然后才从T1中删除相应的记录,就无法实现这一点 更新:我试图运行的实际的DB2 10.5代码: CREATE TABLE t1 ( t1_id INTEGER NOT NULL, PR

在DB2中,假设我有3个表:T1、T2、T3:

我希望定义FK关系时,如果T3中有连接的记录,它将禁止删除T2中的记录,但同时当我从T1中删除记录时,它将分别自动删除T2和T3中的记录

是否可以仅定义FK约束来满足这些要求?或者,如果不编写一个代码,首先从T3中删除相应的记录,然后从T2中删除相应的记录,然后才从T1中删除相应的记录,就无法实现这一点

更新:我试图运行的实际的DB2 10.5代码:

CREATE TABLE t1 (
  t1_id INTEGER NOT NULL,
  PRIMARY KEY(t1_id)
)

CREATE TABLE t2 (
  t2_t1 INTEGER NOT NULL, 
  t2_id INTEGER NOT NULL, 
  PRIMARY KEY (t2_t1, t2_id), 
  CONSTRAINT t2_fk_t1 
    FOREIGN KEY (t2_t1) 
    REFERENCES t1 (t1_id) 
    ON DELETE CASCADE
)

CREATE TABLE t3 (
  t3_t1 INTEGER NOT NULL, 
  t3_t2 INTEGER NOT NULL, 
  t3_id INTEGER NOT NULL, 
  PRIMARY KEY (t3_t1, t3_t2, t3_id), 
  CONSTRAINT t3_fk_t1 
    FOREIGN KEY (t3_t1) 
    REFERENCES t1 (t1_id) 
    ON DELETE CASCADE, 
  CONSTRAINT t3_fk_t2 
    FOREIGN KEY (t3_t1, t3_t2) 
    REFERENCES t2 (t2_t1, t2_id) 
    ON DELETE RESTRICT
)
最后一个
CREATE
语句失败,出现以下错误:

SQL20255N外键“T3_FK_T2”无效,因为它会导致 要删除的子表“S.T3”连接到其祖先表 通过具有冲突删除规则的多个关系执行“S.T1”。 冲突发生在约束的删除规则之间 子表上的“S.T3.T3_FK_T1”和“S.T3.T3_FK_T2”。 原因代码=“3”。SQLSTATE=42915


这应该行得通。即使看起来有点奇怪,也不禁止重叠约束


是的,这是可能的

只需创建一个从T3到T2和T1的外键,T2是对删除的限制,T1没有操作

在T2中,T1的外键也带有级联删除

CREATE TABLE T1 (
  T1_ID INTEGER NOT NULL unique,
  PRIMARY KEY (T1_ID)
);

CREATE TABLE T2 (
  T2_T1 INTEGER NOT NULL        constraint t2_t1_t1_id_fk
            references t1
                on delete cascade, -- parent entity ID from T1
  T2_ID INTEGER NOT NULL unique,
  PRIMARY KEY (T2_T1, T2_ID)
);

CREATE TABLE T3 (
  T3_T1 INTEGER NOT NULL constraint t3_t1_t1_id_fk
        references t1
            on delete cascade, -- parent entity ID from T1
  T3_T2 INTEGER NOT NULL constraint t3_t2_t2_id_fk
        references t2 (t2_id) on delete restrict, -- parent entity ID from T2
  T3_ID INTEGER NOT NULL,
  PRIMARY KEY (T3_T1, T3_T2, T3_ID)
);
请记住,如果您希望使用更严格的外键,也可以从另一个角度简单地执行此操作。(ID中的外键指向引用!)


最坏的情况总是有触发器,一切都有可能。:)

是的,可能是******警告****如果FK级联错误,则数据库中的级联失败将是灾难性的,并且父表和子表中的行都将被删除。。安全的方法是指定restrict。使用外键限制,您必须手动删除每个表中的记录,这样更安全。****从画一幅图开始******我正在DB210.5中尝试,它不允许用“冲突的删除规则”定义T3……哦,天哪。遗憾的是,我从未使用过DB2,而是亲自使用Postgresql。我已经用完整的创建脚本编辑了我的答案,以防万一。对不起,我应该在原始帖子中声明,现在将更新。
CREATE TABLE t1 (
  t1_id INTEGER NOT NULL PRIMARY KEY
);

CREATE TABLE t2 (
  t2_t1 INTEGER NOT NULL REFERENCES t1(t1_id) ON DELETE CASCADE
  , t2_id INTEGER NOT NULL
  , PRIMARY KEY (t2_t1, t2_id)
);

CREATE TABLE t3 (
  t3_t1 INTEGER NOT NULL REFERENCES t1(t1_id) ON DELETE CASCADE
  , t3_t2 INTEGER NOT NULL
        , FOREIGN KEY (t3_t1,t3_t2) REFERENCES t2(t2_t1,t2_id) ON DELETE RESTRICT
  , t3_id INTEGER NOT NULL
        , PRIMARY KEY (t3_t1, t3_t2, t3_id)
);
INSERT INTO t1 (t1_id) VALUES (11), (12),(13), (14), (15);
INSERT INTO t2 (t2_t1,t2_id) VALUES (11, 21), (12,22),(13,23), (14,24), (15,25);
INSERT INTO t3 (t3_t1,t3_t2,t3_id) VALUES (11, 21,31), (12,22,32),(13,23,33), (14,24,34), (15,25,35);


DELETE FROM t1 WHERE t1_id = 13; -- should succeed
DELETE FROM t2 WHERE t2_id = 24; -- should fail

SELECT * FROM t1;
SELECT * FROM t2;
SELECT * FROM t3;
CREATE TABLE T1 (
  T1_ID INTEGER NOT NULL unique,
  PRIMARY KEY (T1_ID)
);

CREATE TABLE T2 (
  T2_T1 INTEGER NOT NULL        constraint t2_t1_t1_id_fk
            references t1
                on delete cascade, -- parent entity ID from T1
  T2_ID INTEGER NOT NULL unique,
  PRIMARY KEY (T2_T1, T2_ID)
);

CREATE TABLE T3 (
  T3_T1 INTEGER NOT NULL constraint t3_t1_t1_id_fk
        references t1
            on delete cascade, -- parent entity ID from T1
  T3_T2 INTEGER NOT NULL constraint t3_t2_t2_id_fk
        references t2 (t2_id) on delete restrict, -- parent entity ID from T2
  T3_ID INTEGER NOT NULL,
  PRIMARY KEY (T3_T1, T3_T2, T3_ID)
);