我只想更新 1 行(id),并且只有当状态为 == 时才更新为 stat
UPDATE link_list SET status=0 WHERE id=@id AND status=@stat;
现在我想删除所有行,但只有在上面受到影响的情况下,我如何将下面的内容更改为仅在上面受到影响的情况下才删除?
DELETE link_list WHERE linkId=@id;
我只想更新 1 行(id),并且只有当状态为 == 时才更新为 stat
UPDATE link_list SET status=0 WHERE id=@id AND status=@stat;
现在我想删除所有行,但只有在上面受到影响的情况下,我如何将下面的内容更改为仅在上面受到影响的情况下才删除?
DELETE link_list WHERE linkId=@id;
什么数据库?
在支持 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 的外键约束,让引擎为您执行删除操作。
我支持@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 是明智的。
注意:我没有测试过这个,所以要小心并彻底测试。
您只能删除状态为 0 的行 - 您不能直接说出这是否是在上次更新中
删除状态为 0 的位置
DELETE link_list WHERE linkId=@id and statua = 0
您可以尝试检查@@rowcount
,它会为您提供受前一条语句影响的行数。