批量插入仅新行

时间:2014-06-27 22:07:00

标签: sql sql-server

我有一组用于填充SQL数据库的csv文件。我把它设置为日常过程。我刚刚发现,每天都有少量文件包含所有历史数据,而不仅仅是每日更新。

当我尝试进行批量插入时,会导致错误,因为主键被违反了。

我认为设置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)
);

然后,当我尝试运行更新表的脚本时,我得到了无用的错误消息“关联语句未准备好(0)。”

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

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

1 个答案:

答案 0 :(得分:0)

插入table1(column1)值(value1)

...因此,如果您只想忽略失败的插入,请执行INSERT IGNORE INTO。然后它会尝试插入值,失败,然后优雅地继续前进。如果您希望它用它尝试插入的新值替换重复的键值,请检查:(下面,忽略可选,取决于您是否希望它抛出错误。)

INSERT [IGNORE] INTO table1 (column1) values (value1) ON DUPLICATE KEY UPDATE

所以“插入忽略”就是答案,插入不在表创建上。参考mysql docs。和ON DUPLICATE KEY UPDATE很有用。