1

当两个表由包含一个由两个 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 表”

4

1 回答 1

3

在删除级联时有时被称为“危险的”,因为无意识的查询最终可能会删除比您想象的更多的东西。我至少见过一种情况,其中不正确的 where 子句(无意中删除了树中的根节点)最终通过级联删除删除了比预期更多的堆(即那些根节点的子树)。

从这个意义上说,连接删除同样危险。

偶尔向正在学习 SQL 的用户建议的是根本不要使用级联删除。这迫使他们注意删除的内容和顺序,因为当他们的 where 子句不正确时,他们会收到方便的错误消息。但是,如果您对 SQL 足够熟悉而不必担心使用连接删除,那么您很可能已经过了这一点。

于 2013-06-08T15:28:47.137 回答