我有一点想法(至少对我而言),我希望这主要是因为我还不是宇宙的SQL大师。基本上我有三张桌子:
表A,表B和表C.
表C有一个表B的FK(Foriegn Key),它与表A有FK。(每个都是多对一)
我需要从表A中删除一个条目,当然还有表B和C中所有相应的条目。过去我使用了一个游标来执行此操作,选择表B中的所有条目并循环遍历每个条目。一个删除表C中的所有相应条目。现在这工作 - 并且一直工作正常,但我怀疑/希望有一个更好的方法来实现这种效果,而无需使用游标。所以这是我的问题 - 如何在不使用光标的情况下完成此操作,还是可以完成?
(如果我不清楚,请告诉我 - 我会尝试解决问题)。
答案 0 :(得分:11)
将您的FOREIGN KEY
声明为ON DELETE CASCADE
答案 1 :(得分:8)
你可以通过几种方式做到这一点......
CREATE TABLE TableB
(FKColumn INT,
CONSTRAINT MyFk FOREIGN KEY (FKColumn)
REFERENCES TableA(PKColumn) ON DELETE CASCADE)
CREATE TRIGGER cascade_triggerA
ON TableA
FOR DELETE
AS
BEGIN
DELETE TableB
FROM TableB JOIN DELETED ON TableB.FKColumn = DELETED.PKColumn
END
CREATE TRIGGER cascade_triggerB
ON TableB
FOR DELETE
AS
BEGIN
DELETE TableC
FROM TableC JOIN DELETED ON TableC.FKColumn = DELETED.PKColumn
END
在上述任何一种情况下,你只需删除表A中的记录,让级联和触发器处理其余的事情。
答案 2 :(得分:5)
已经给出的答案(级联删除和触发器)很棒,但您可能在不能选择这些选项的环境中工作。如果是这样,下面是纯粹的SQL解决方案。该示例仅涉及DELETE语法。在现实世界中,您可能将其包装在事务中并将其实现为存储过程。
--
DECLARE @Param_PK_TableA int
SET @Param_PK_TableA = 1500
-------------------------------
-- TABLE C --------------------
DELETE TableC
FROM TableC
INNER JOIN TableB
ON TableB.TableB_ID = TableC.TableB_ID
INNER JOIN TableA
ON TableA.TableA_ID = TableB.TableA_ID
WHERE
(TableA.TableA_ID = @Param_PK_TableA)
-------------------------------
-- TABLE B --------------------
DELETE TableB
FROM TableB
INNER JOIN TableA
ON TableA.TableA_ID = TableB.TableA_ID
WHERE
(TableA.TableA_ID = @Param_PK_TableA)
-------------------------------
-- TABLE A --------------------
DELETE TableA
WHERE
(TableA.TableA_ID = @Param_PK_TableA)
答案 3 :(得分:2)
为两个表创建外键关系时,可以指定ON DELETE CASCADE,当您删除A中的记录时,它会为您处理此事。