sql - 当我一次又一次用相同的值更新表时会发生什么?

标签 sql sql-server database triggers updates

当我一次又一次用相同的值更新表时会发生什么? 例如:

update tblExample set Col1 =1214 where 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 上有一个触发器,它仍然会触发,并执行它通常会执行的任何操作。如果您不希望这样做,则需要检查 inserteddeleted 中列的值,看看是否不同。

为了进一步扩展,这里有一个带有触发器的小演示(请注意,通常在触发器中使用返回数据集的 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;

关于sql - 当我一次又一次用相同的值更新表时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51209457/

相关文章:

mysql - 如何删除没有主键的所有重复行?

mysql - 使用 SQL 数据库查询以不同的时间间隔减去相同的列值

mysql - 从 MySQL 迁移到 SQL-Server 且索引键大小太大

java - 过程或函数 'search_words1' 需要参数 '@result' ,但未提供该参数

java - 准备好的语句更新问题

mysql - 计算联合中的不同列并显示在同一行中

sql-server - SQL Server数据库设计用户、组、角色、成员

php - 新行未按升序插入 - MYSQL

python - 如何创建自动更新的 sqlite 表?

php - 在页面加载时将数据插入 mysql 数据库