0

我只想更新 1 行(id),并且只有当状态为 == 时才更新为 stat

UPDATE link_list SET status=0 WHERE id=@id AND status=@stat;

现在我想删除所有行,但只有在上面受到影响的情况下,我如何将下面的内容更改为仅在上面受到影响的情况下才删除?

DELETE link_list WHERE linkId=@id;
4

4 回答 4

3

什么数据库?

在支持 OUTPUT 子句的数据库中(SQL Server、ORacle,我认为是 DB2)很简单:

UPDATE link_list SET status=0 
OUTPUT @linkID= DELETED.@id
WHERE id=@id AND status=@stat;

DELETE link_list WHERE linkId=@linkID;

另一种选择是使用带有 ON DELETE CASCADE 的外键约束,让引擎为您执行删除操作。

于 2009-11-12T22:05:51.160 回答
1

我支持@Rahuls 建议使用触发器的评论。这是另一种选择:

UPDATE link_list SET status=0, id=(@affectedid:=id) WHERE id=@id AND status=@stat;

DELETE link_list WHERE linkId = @affectedid;

@affectedid如果没有匹配的行,用户变量应该为 NULL,因此将DELETE是无操作的。但是,如果您可能在给定会话中多次执行此操作,则值@affectedid可能会从较早的更新中继承,因此将其显式设置为 NULL 是明智的。

注意:我没有测试过这个,所以要小心并彻底测试。

于 2009-11-12T22:06:39.003 回答
0

您只能删除状态为 0 的行 - 您不能直接说出这是否是在上次更新中

删除状态为 0 的位置

DELETE link_list WHERE linkId=@id and statua = 0
于 2009-11-12T22:04:03.170 回答
0

您可以尝试检查@@rowcount,它会为您提供受前一条语句影响的行数。

于 2009-11-12T22:23:25.413 回答