我有一个更新表的更新语句。并且有一列记录上次修改时间。如果未更改特定行中的数据,我不想更改上次修改的日期时间。
检查更新语句是否会更改数据行的最佳方法是什么。
谢谢,
答案 0 :(得分:9)
检查代码中的旧数据与新数据,而不是在查询中执行此操作。
如果数据根本没有改变,则无需不必要地打扰数据库层。
简而言之,如果数据没有改变,请不要发送UPDATE语句。
答案 1 :(得分:2)
一种方法是启动一个事务,选择该行的内容并将其与您要更新它的内容进行比较。如果它们不匹配,则执行更新并结束事务。如果匹配,则回滚事务。
答案 2 :(得分:1)
如果你想要抢先这样做,我能想到的唯一方法就是修改update语句的WHERE子句来比较现有值和新值(对于每个值)。如果 ANY 不相等,则应进行更新。
答案 3 :(得分:1)
这就是DAL很方便的时候。它会跟踪所有列,所以如果没有更改,那么我甚至不会向数据库发送UPDATE语句。
答案 4 :(得分:1)
听起来你正在浏览一个表并修改一些行,然后你想第二次在表中返回并更新刚刚更改过的行的时间戳。
不要两次通过。只需在更新要更改的其他列时同时更新日期/时间:
UPDATE myTable
SET retailprice = wholesaleprice * 1.10,
lastmodified = GetDate()
WHERE ...
或者您是在所有行上发布更新语句,但对于大多数行,它只是将其设置为已有的值?不要那样做。排除那些在where子句中不会被修改的行:
UPDATE myTable
SET retailprice = wholesaleprice * 1.10,
lastmodified = GetDate()
WHERE retailprice <> wholesaleprice * 1.10
答案 5 :(得分:1)
这取决于您是否控制了数据。上面的Seb说你应该在更新前检查旧数据与新数据是正确的。但是,如果数据不在您的控制之下呢?
假设您是要求进行更新的网络服务。然后检查的唯一方法是查询现有数据并将其与新数据进行比较。
不知道任何可以检测更新是否实际更改了任何数据的SQL功能。
SQL中有一些方法可以检测update语句中包含的行数。不知道检测更新语句是否实际更改了任何数据的方法,这将是有趣的。
答案 6 :(得分:1)
如果您使用的是sql 2005/2008,那么您可以在存储过程中执行以下操作。
update newTable
set readKey='1'
output inserted.id,
inserted.readKey as readKey,
deleted.readKey as prevReadKey
into @tempTable
where id = '1111'
然后,您可以从@tempTable中选择以验证prevReadKey和readKey是否具有相似的值,如果两者具有相似的值,则可以重置上次修改的日期时间。
这样,在实际更改值时,您不必在表上触发多个查询。但是在值没有改变的情况下是的,这将触发两个更新语句,其中不需要。如果这些情况很少,这应该没问题。
P.S。注意: - 给出的查询可能在语法上是错误的,因为它没有经过测试。但这是你的问题可以解决的方式。我在以下方式中使用OUTPUT子句和我的一个项目中的Merge语句完成它,也可以使用update语句完成。这是reference of OUTPUT Clause
答案 7 :(得分:0)
您可以在T-SQL中编写一个INSTEAD OF UPDATE触发器,您可以在DAL层中执行上面建议的操作 - 比较现有记录中的值与update语句中的值,并应用是否更新。您可以在触发器中使用Columns_Updated()函数来查看是否有任何更新,并相应地继续。
从机器的角度来看,它并不是特别有效,但你可以写一次,无论哪个应用程序,存储过程或其他进程试图更新记录,它都会处理这种情况。