sql - 从具有两个父级的子表中删除,而无需在 sql server 中进行级联删除
问题描述
我需要你的指导。我创建了一个脚本来分别从 3 个表中删除。意思是当我创建脚本时是从 table3(子)删除,然后从 2(子)删除,然后从 table1(父)删除我对 Table3 有问题,因为 table2 对 table2 和 table1 都有外键,所以我不能删除它在我删除 table2 之前,如果我先删除 table2,那么我会丢失用于查找要删除的行的引用,然后我从 table3 和 table1 中删除 0。
该脚本如下所示
DELETE FROM table3 t3
INNER JOIN table1 t1 ON t3.t1ID = t1.t1ID
INNER JOIN table2 t2 i ON t2.t1ID = t1.t1ID
WHERE t3.t1ID IN(
SELECT DISTINCT t1.t1ID
FROM t2
WHERE (
(t2.t2ID IS NULL AND t1.LastDate <@UpDate )))
上面删除 0,因为我在删除表 2 之前从
DELETE
FROM table2 t2
INNER JOIN table1 t1 on t2.T1ID =t1.t1ID
WHERE t2.t1ID IN(
SELECT DISTINCT t1.T1ID
FROM t2
WHERE (
(t2.t2ID is null and t1.LastDate <@UpDate <@UpDate )))
它也不会从 table1 中删除,因为脚本会查找 table2 中不存在的位置
DELETE
FROM table1 t1
INNER JOIN table2 t2 i ON t2.t1ID = t1.t1ID
WHERE t1.t1ID IN(
SELECT DISTINCT t1.t1ID
FROM t2
WHERE (
(t2.t2 IS NULL ANDt1.LastDate <@UpDate)))
解决方案
尝试这样的事情:
DECLARE @RowsToDelete TABLE
(
RowsToDeleteID int IDENTITY(1,1) PRIMARY KEY,
Table1ID int,
Table2ID int,
Table3ID int
);
INSERT @RowsToDelete (Table1ID, Table2ID, Table3ID)
SELECT DISTINCT t1.t1ID, t2.t2ID, t3.t3ID
FROM table3 AS t3
INNER JOIN table1 AS t1
ON t3.t1ID = t1.t1ID
INNER JOIN table2 AS t2
ON t2.t1ID = t1.t1ID
WHERE t2.t2ID IS NULL
AND t1.LastDate < @UpDate;
DELETE table2
WHERE EXISTS (SELECT 1 FROM @RowsToDelete AS rtd WHERE rtd.Table2ID = t2ID);
DELETE table1
WHERE EXISTS (SELECT 1 FROM @RowsToDelete AS rtd WHERE rtd.Table1ID = t1ID);
DELETE table3
WHERE EXISTS (SELECT 1 FROM @RowsToDelete AS rtd WHERE rtd.Table3ID = t3ID);
没有桌子等来尝试,但看起来应该没问题。
我在这里还假设这些行在您执行此操作时可能不会发生变化,否则您可能会有竞争条件。
推荐阅读
- python-3.x - Uncaught ReferenceError: False 未在 python django 模板中定义
- java - 使用默认设置时使用哪个 Spring Cloud Zuul 超时属性?
- python - 将两个变量分配给同一列表中的项目是访问这些项目并对其执行操作的最佳方式吗?
- kubernetes - 用户如何在不访问 Rancher GUI 的情况下获取其 kubeconfig
- vb.net - 在 type="date" 的 TextBox 中显示日期
- javascript - 如何在本机反应中将状态从兄弟姐妹发送或传递给兄弟姐妹?
- java - 如何修复 java.lang.IllegalStateException:预期 BEGIN_OBJECT 但在第 1 行第 1 列路径 $
- java - 使用 SXSSFWorkbook 创建 excel 并使用 XSSFWorkbook 修改时,字符串单元格数据在 excel 编辑器中不可见
- java - 在集成测试中在 Spring 控制器中模拟 Feign 客户端
- android - TextView 使用转义字符显示错误