我运行了以下查询。
update Finished_goods_adjustment_detail
set Actual_Price_Per_Piece = 5.90
Select *
from
--Finished_Goods_Adjustment F left join
Finished_goods_adjustment_detail fd
--on f.Company_Code=fd.Company_Code and f.Division_Code =fd.Division_Code and f.Ticket_Number = fd.Ticket_Number
Where Fd.Ticket_Number = '10063677' and fd.Company_Code ='01' and fd.Division_Code ='006'
我打算注释掉
Select *
from
但是我忘了。
我在注释选择*部分和更新集部分之间交替显示,以检查所做的更改。
我不小心用select *部分运行查询,但其中包含where子句。
现在看来,Finished_goods_adjustment_detail表中所有行的Actual_Price_Per_Piece字段都变成了5.90。
我不确定那是否是以前的样子,但我对此表示怀疑。使用select *不注释运行上面的查询会导致这种情况发生吗?即使在哪里说特定的票号?请帮忙。
说
(受影响的445217行)
在它下面说
(受影响的8行)(正确的数量)
在“消息”标签中。
答案 0 :(得分:7)
不幸的是,该完整查询会导致SQL执行2条命令:
update
子句的where
查询select
子句的where
查询这就是为什么您看到2个结果集计数的原因。 445217应该是update
,而8就是select
。
要还原数据,希望您有一个最近的备份,可以将其还原到单独的位置,以便可以仅更新此表(尤其是如果您有时间点恢复功能)。
对于将来的开发,如果要在较低的环境中进行测试,但是要测试联接,则可以重新编写注释,以防止出现PRD风险:
update Finished_goods_adjustment_detail
set Actual_Price_Per_Piece = 5.90
-- Select * from
--Finished_Goods_Adjustment F left join
Finished_goods_adjustment_detail fd
--on f.Company_Code=fd.Company_Code and f.Division_Code =fd.Division_Code and f.Ticket_Number = fd.Ticket_Number
Where Fd.Ticket_Number = '10063677' and fd.Company_Code ='01' and fd.Division_Code ='006'
现在,您只需突出显示SELECT *
中的所有内容即可仅使用SELECT
获得结果,或者运行整个查询以获取UPDATE
。无论哪种方式,都可以防止在没有正确的联接或SELECT
子句的情况下意外运行UPDATE
或WHERE
。
答案 1 :(得分:1)
Jason W提供的答案几乎可以解决这个问题。但是,我想对以后如何避免这种情况提供一些建议(您知道,我们所有人中都有这些时刻,包括我自己)。
具体来说,通过稍微调整编码样式,可以引入可靠的故障保护功能,这样更新将无法进行。您需要做的只是通过别名而不是名称来引用更新的表:
update fd
set Actual_Price_Per_Piece = 5.90
Select *
from
Finished_goods_adjustment_detail fd
Where Fd.Ticket_Number = '10063677' and fd.Company_Code ='01' and fd.Division_Code ='006'
在fd
子句中定义了FROM
别名,并且(希望)数据库中不存在具有该名称的对象。这样,update
将因“找不到对象”错误而中断,并且select
将照常运行(或根本不运行,这取决于XACT_ABORT
连接选项和{ {1}},仅举几例。
很简单,真的。
P.S。顺便说一句,同样的方法也适用于Try/Catch
语句。只是说'...