在插入语句中违反主键 - 整个声明是否被终止



我有一个语句从另一个表更新表

INSERT INTO table1 SELECT * FROM table2

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

违反主要密钥约束'pk_xxx'。无法插入对象'table1'
中的重复键 该声明已终止

如果来自Table2的SELECT返回100行,则仅违反插入未施加到表1,或者整个INSERT INTO语句因违反PK而未投入/滚动?

不提交整个语句。这样的测试非常容易:

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

最新更新