当两个表由包含一个由两个 fk 构建的约束的第三个表链接时,在 delete cascade 或 join delete 上使用是一个好习惯吗?
create T1 (
id1 ...
...
CONSTRAINT pk_id1 PRIMARY KEY (id1) );
create T2 (
id2 ...
...
CONSTRAINT pk_id2 PRIMARY KEY (id2) );
create T3 (
id1 ...,
id2 ...,
CONSTRAINT pk_T3 PRIMARY KEY (id1, id2),
CONSTRAINT fk_T3_1 FOREIGN KEY (id2)
REFERENCES T2 (id2) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT fk_T3_2 FOREIGN KEY (id1)
REFERENCES T1(id1) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE )
有人说在 delete cascade 上使用很危险,那么 join delete 的危险性更低吗?
编辑:我没有找到要删除的正确查询:
如果我这样做 了
delete from T1 where id1=$id1
然后从 T1 中删除行 $id1,从 T3 中删除行 $id1,$id2 但不是从 T2 中删除 $id2。
如果我做
delete from T3 where id1=$id1 and id2=$id2
那么 $id1 行在 T1 中没有被删除,$id2 行在 T2 中没有被删除,这对 ($id1,$id2) 在 T3 中被删除。
如何在一个查询中删除?
编辑:我想通过移动 T2 表中的一个约束来找到一个技巧,如下所示:
create T1 (
id1 ...
...
CONSTRAINT pk_id1 PRIMARY KEY (id1) );
create T2 (
id2 ...
...
CONSTRAINT pk_id2 PRIMARY KEY (id2) ),
CONSTRAINT fk_T2 FOREIGN KEY (id2)
REFERENCES T3 (id2) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE);
create T3 (
id1 ...,
id2 ...,
CONSTRAINT pk_T3 PRIMARY KEY (id1, id2),
CONSTRAINT fk_T3_2 FOREIGN KEY (id1)
REFERENCES T1(id1) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE );
但我有消息“没有唯一约束......对于引用的 T3 表”