【发布时间】:2013-07-06 12:34:07
【问题描述】:
可以使用连接语句来限定要删除的集合进行删除,例如:
DELETE J
FROM Users U
inner join LinkingTable J on U.id = J.U_id
inner join Groups G on J.G_id = G.id
WHERE G.Name = 'Whatever'
and U.Name not in ('Exclude list')
但是,我有兴趣删除连接条件的两边——LinkingTable 记录和它所依赖的用户记录。我无法打开级联,因为我的解决方案是首先使用实体框架代码,并且双向关系会产生多个级联路径。
理想情况下,我想要这样的东西:
DELETE J, U
FROM Users U
inner join LinkingTable J on U.id = J.U_id
...
从语法上讲,这行不通,但我很好奇这样的事情是否可能?
【问题讨论】:
-
不行,一条 DML 语句只能影响一张表。您的选择是删除其中一个约束(并可能使用触发器强制执行它)。
-
我认为您需要在问题中更清楚地说明您的外键指向两个方向。
-
@AaronBertrand:谢谢——这就是我一直在寻找的答案:DML 语句只能影响一个表,因此我想要的是不可能的。我们必须想办法解决这个问题。如果你写了一个答案,我会标记它。
-
@bwerks 由于Delete语句只影响一个表,您可以使用
"deleted" pseudo table从多个表中删除值,通过加入来一一删除,请参阅下面的答案 -
@Aaron,并不是所有的 DML stmts 都是单表操作。例如在 select stmt 中使用 OUTPUT 子句,我们可以同时在 2 个表中执行 INSERT。对于删除是,除非启用 Cascde 删除是 SQL 服务器中的一个表 stmt。
标签: sql sql-server delete-row cascading-deletes