我有一个声明来更新另一个表中的表
INSERT INTO table1 SELECT * FROM table2
由于某些垃圾测试数据仍在表1中(但可能在现场发生的情况,一切皆有可能),我收到错误
违反PRIMARY KEY约束'PK_xxx'。无法在对象'table1'中插入重复键 该声明已被终止
如果table2中的SELECT
返回100行,那么只是违反的插入没有提交到table1,或者是由于PK违规而未提交/回滚的整个INSERT INTO
语句?
答案 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