删除不同表中的记录

Ich*_*aki 1 sql-server delete sql-server-2008-r2 php xampp

我需要删除所有三个表中 UserIndex = 1 和 ItemNumber = 5202 的记录,所有这些记录都在单个查询中。我正在使用 SQL 2008 R2。

表用户信息1

用户索引 项目编号 项目计数
1 5202 99
1 1600 50
2 155 2
3 125 60

表用户信息2

用户索引 项目编号 项目计数
8 1265 50
4 1899 41
1 5202 99
3 125 60

表用户信息3

用户索引 项目编号 项目计数
6 5205 85
1 6666 41
3 4455 44
1 5202 50

我尝试将此查询与两个表一起使用,但它不起作用:

DELETE ItemInfo1, ItemInfo2 
FROM ItemInfo1 
LEFT JOIN ItemInfo2 
    ON ItemInfo1.UserIndex = ItemInfo2.UserIndex 
WHERE ItemInfo1.UserIndex = 1;
Run Code Online (Sandbox Code Playgroud)

Pau*_*ite 5

通常,您无法在单个 T-SQL 语句中从多个表中进行删除DELETE

使用触发器或带有选项的级联外键可以达到相同的效果ON DELETE CASCADE,但这可能不是您所需要的。

如果您只想提交一批文本并确保所有三个删除操作作为一个单元成功或失败,请使用事务:

SET XACT_ABORT ON;

BEGIN TRY
    BEGIN TRANSACTION;

        DELETE FROM dbo.UserInfo1
        WHERE
            UserIndex = 1 
            AND ItemNumber = 5202;

        DELETE FROM dbo.UserInfo2
        WHERE
            UserIndex = 1 
            AND ItemNumber = 5202;

        DELETE FROM dbo.UserInfo3
        WHERE
            UserIndex = 1 
            AND ItemNumber = 5202;

    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    DECLARE @msg nvarchar(2048) = ERROR_MESSAGE();
    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
    RAISERROR (@msg, 16, 1);
    RETURN;
END CATCH;
Run Code Online (Sandbox Code Playgroud)

更一般地说,仅通过后缀号来区分此类相似的表是一种不好的模式。这表明您确实应该有一个表,而不是一个额外的列来区分这三个集合。

那么单个声明DELETE就变得微不足道了。