在INSERT INTO语句中违反主键 - 整个语句是否终止?

时间:2014-02-05 16:01:38

标签: tsql sql-server-2008-r2 rdbms

我有一个声明来更新另一个表中的表

INSERT INTO table1 SELECT * FROM table2

由于某些垃圾测试数据仍在表1中(但可能在现场发生的情况,一切皆有可能),我收到错误

  

违反PRIMARY KEY约束'PK_xxx'。无法在对象'table1'中插入重复键   该声明已被终止

如果table2中的SELECT返回100行,那么只是违反的插入没有提交到table1,或者是由于PK违规而未提交/回滚的整个INSERT INTO语句?

1 个答案:

答案 0 :(得分:1)

整个声明未提交。这很容易测试,如下:

Create Table #Target (Id Int Primary Key)
Insert Into #Target Values(1)
Insert Into #Target Values(3)
Insert Into #Target Values(5)
Insert Into #Target Values(7)

Create Table #Source (Id Int)
Insert Into #Source Values(1)
Insert Into #Source Values(2)
Insert Into #Source Values(3)
Insert Into #Source Values(4)
Insert Into #Source Values(5)
Insert Into #Source Values(6)
Insert Into #Source Values(7)
Insert Into #Source Values(8)

Insert Into #Target(Id)
Select Id From #Source

Select * From #target

Drop Table #Target
Drop Table #Source

上面的代码使用主键创建目标表。然后它创建一个具有相同列但不同值的源表。然后执行与您发布的命令类似的命令,我们将源表中的行插入目标表。

然后我们从目标表中选择。如您所见,只有原始值。

如果您使用此代码,则只会插入缺少的行。

Insert
Into   #Target
Select  #Source.*
From    #Source
        Left Join #Target
            On #Source.Id = #Target.Id
Where   #Target.Id Is NULL