sql - 当我一次又一次地用相同的值更新表时会发生什么?
问题描述
当我一次又一次地用相同的值更新表时会发生什么?前任 :
更新 tblExample 设置 Col1 =1214 其中 Id=17
假设我在不更改任何列的情况下继续使用相同的值更新此记录。执行将如何发生?当我们在更新后触发器中执行此操作时会发生什么?
解决方案
如果您运行一个UPDATE
语句,该UPDATE
语句将运行(惊喜),即使您设置列的值是相同的值。例如:
CREATE TABLE dbo.test (ID int, SomeString varchar(10));
INSERT INTO dbo.test
VALUES(1,'abc'),
(2,'def');
GO
--Will return 1 row updated
UPDATE dbo.test
SET SomeString = 'abc'
WHERE ID = 1;
GO
--Will return 1 row updated
UPDATE dbo.test
SET SomeString = 'abc'
WHERE ID = 1;
GO
当您运行这些UPDATE
语句时,SomeString
仍会设置 的值。因此,如果您UPDATE
在该表上有一个触发器,它仍然会触发,并执行它通常会执行的任何操作。如果您不希望这样做,则需要检查其中列的值inserted
并deleted
查看它是否不同。
为了进一步扩展,这里有一个带触发器的小演示(请注意,通常在SELECT
触发器中有一个返回数据集的语句是不好的,并且(如果我没记错的话)是 SQL Server 2017 中已弃用的功能)。
CREATE TRIGGER dbo.test_trg ON dbo.test
AFTER UPDATE AS
SELECT *
FROM inserted; --SELECTs in triggers are bad!
GO
--Will perform the SELECT in the trigger
UPDATE dbo.test
SET SomeString = 'abc'
WHERE ID = 1;
GO
--Instead, check is the value is different
ALTER TRIGGER dbo.test_trg ON dbo.test
AFTER UPDATE AS
SELECT i.*
FROM inserted i
JOIN deleted d ON i.ID = d.ID
WHERE i.SomeString != d.SomeString; --SELECTs in triggers are bad!
GO
--Won't return any rows
UPDATE dbo.test
SET SomeString = 'abc'
WHERE ID = 1;
--Will return a row
UPDATE dbo.test
SET SomeString = 'bcd'
WHERE ID = 1;
GO
--Cleanup
DROP TABLE dbo.test;
推荐阅读
- android-room - 将 Room 与 LiveData 一起使用时如何处理异常
- c# - 如何用空格字符替换没有数字字符?
- sql - 每个日期的唯一行号与分区
- azure-storage - 写入天蓝色表存储时,我们有时会看到行为
- python - ID标签不会自动增加python中的数字
- javascript - 数组中的值不相加
- html - 我想将我的卡附加到另一个 html 页面
- javascript - 无法在谷歌地球中呈现 kml 文件
- java - 如何从 java 程序中重新运行 java 代码?
- angularjs - AngularJs 如何使用 angular-jwt 从 $localStorage 获取 jwt 令牌