sql,仅当受上一个UPDATE命令影响时才删除行
我只想更新1行(id),并且仅当状态为==to stat时更新sql,仅当受上一个UPDATE命令影响时才删除行,sql,delete-row,Sql,Delete Row,我只想更新1行(id),并且仅当状态为==to stat时更新 UPDATE link_list SET status=0 WHERE id=@id AND status=@stat; 现在我想删除所有行,但仅当上面的行受到影响时,如何将下面的行更改为仅当上面的行受到影响时删除 DELETE link_list WHERE linkId=@id; 您只能删除状态为0的行-不能直接说这是否在上次更新中 要删除状态为0的位置,请执行以下操作 DELETE link_list WHERE link
UPDATE link_list SET status=0 WHERE id=@id AND status=@stat;
现在我想删除所有行,但仅当上面的行受到影响时,如何将下面的行更改为仅当上面的行受到影响时删除
DELETE link_list WHERE linkId=@id;
您只能删除状态为0的行-不能直接说这是否在上次更新中 要删除状态为0的位置,请执行以下操作
DELETE link_list WHERE linkId=@id and statua = 0
您只能删除状态为0的行-不能直接说这是否在上次更新中 要删除状态为0的位置,请执行以下操作
DELETE link_list WHERE linkId=@id and statua = 0
什么数据库
在支持输出子句的数据库中(SQL Server、ORacle、我认为DB2)很容易:
另一个选项是使用带ON DELETE CASCADE的外键约束,让引擎为您执行删除操作。什么数据库
在支持输出子句的数据库中(SQL Server、ORacle、我认为DB2)很容易:
另一种选择是使用带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
注意:我还没有测试过这个,所以要小心并彻底测试。我支持@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
注意:我没有对此进行测试,因此请小心并彻底测试。您可以尝试检查
@@rowcount
,它提供受上一条语句影响的行数。您可以尝试检查@@rowcount
,它提供受上一条语句影响的行数。使用更新后触发器,用你使用的RDBMS品牌来标记你的问题可能会有帮助。“sql”不指定品牌,只指定语言。使用更新触发器后,它可能会有帮助使用您使用的RDBMS品牌标记您的问题可能会有帮助。“sql”不指定品牌,只指定语言。输出
受Oracle支持?我只看到了名为的功能返回:没错,我在Oracle中加入了输出语法。我认为返回可以以相同的方式使用。@Remus:Yep-通常使用相同的功能,使用不同的语法。OUTPUT
受Oracle支持吗?我只看到了名为的功能返回:没错,我在Oracle中加入了输出语法。我认为返回可以以相同的方式使用。@Remus:Yep-通常,相同的功能使用不同的语法;SQL%ROWCOUNT(如果您使用的是Oracle)。这是假定SQL Server;SQL%ROWCOUNT(如果您正在使用Oracle)。