Sql 只批量插入新行

Sql 只批量插入新行,sql,sql-server,Sql,Sql Server,我有一组csv文件,用于填充SQL数据库。我将此设置为一个日常流程。但我刚刚发现,每天都会有一些文件包含所有历史数据,而不仅仅是每日更新 当我尝试执行大容量插入时,这会导致错误,因为主键被违反 我认为设置IGNORE_DUP_KEY=ON会阻止插入非唯一记录 CREATE TABLE TABLE1 ( Column1 varchar(32), Column2 varchar(32), Column3 char(9), Column4 int, Column5 float(53), Column6

我有一组csv文件,用于填充SQL数据库。我将此设置为一个日常流程。但我刚刚发现,每天都会有一些文件包含所有历史数据,而不仅仅是每日更新

当我尝试执行大容量插入时,这会导致错误,因为主键被违反

我认为设置IGNORE_DUP_KEY=ON会阻止插入非唯一记录

CREATE TABLE TABLE1
(
Column1 varchar(32),
Column2 varchar(32),
Column3 char(9),
Column4 int,
Column5 float(53),
Column6 date,
CONSTRAINT pk_One
    PRIMARY KEY (Column1, Column2, Column6)
    WITH (IGNORE_DUP_KEY = ON)
);
然后,当我尝试运行更新表的脚本时,会收到一条毫无帮助的错误消息“Associated statement is not prepared(0)”

我可以通过将结果写入一个单独的表中,然后将新行正确地写入表中来解决这个问题,但是对不同的表进行单独处理让我感到痛苦和丑陋

有没有一种简单的方法可以告诉SQL只写不违反主键约束的行

插入表1(第1列)值(第1列)

。。。所以,如果您只想忽略失败的插入,请将忽略插入。然后它将尝试插入值,失败,然后优雅地继续。如果希望它用尝试插入的新值替换重复的键值,请签出:(下面,忽略可选值,取决于是否希望它抛出错误。)


所以“insert ignore”是答案,在insert上,而不是在表创建上。提到知道重复密钥更新是很有用的。

如果您对加载暂存表犹豫不决,请不要担心。在执行ETL时,通常会有包含一个或多个CSV文件的原始值的暂存表。然后,您可以使用
Insert
Merge
语句控制加载过程。暂存表还允许您更好地控制入站数据的质量控制。
INSERT [IGNORE] INTO table1 (column1) values (value1) ON DUPLICATE KEY UPDATE