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)
通常,您无法在单个 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
就变得微不足道了。
归档时间: |
|
查看次数: |
74 次 |
最近记录: |