【问题标题】:Delete from child table with two parents without cascade delete in sql server从具有两个父级的子表中删除,而无需在 sql server 中进行级联删除
【发布时间】:2019-11-30 23:11:01
【问题描述】:

我需要你的指导。 我创建了一个脚本来分别从 3 个表中删除。 意思是当我创建脚本时是从 table3 (child) 中删除 然后从 2(子)删除,然后从 table1(父)删除 我在使用 Table3 时遇到问题,因为 table2 对 table2 和 table1 所以在删除 table2 之前我无法删除它 如果我先删除 table2,那么我会丢失用于查找行的参考 delete 然后我从 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)))

【问题讨论】:

    标签: sql sql-server parent-child sql-delete cascade


    【解决方案1】:

    试试这样的:

    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);
    

    还没有桌子等可以尝试,但看起来应该没问题。

    我在这里还假设这些行在您执行此操作时可能不会发生变化,否则您可能会遇到竞争条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2018-08-09
      • 2020-05-22
      相关资源
      最近更新 更多