我正在运行一个将大量数据插入Postgres数据库的python脚本,我使用一个查询执行多次行插入:
INSERT INTO table (col1,col2) VALUES ('v1','v2'),('v3','v4') ... etc
我想知道如果它插入一个重复键会发生什么。它会停止整个查询并引发异常吗?还是仅忽略该特定行的插入并继续?
该INSERT
会只是插入所有行 _ 没什么_ 特别不会发生, 除非 你有某种
约束条件
不允许重复/重叠值(PRIMARY KEY
,UNIQUE
,CHECK
或EXCLUDE
约束) -你没有在你的问题提了。但这就是您可能担心的。
假设UNIQUE
或上有PK约束(col1,col2)
,则您正在处理教科书UPSERT
情况。许多相关的问题和解答可以在这里找到。
通常,如果违反了 任何 约束,则会引发异常(除非陷入过程服务器端语言,如plpgsql),该异常不仅会回滚语句,还会回滚 _ 整个事务_ 。
即:没有其他事务会尝试同时写入同一表。
使用WHERE NOT EXISTS ...
或任何其他适用的技术排除表中已经存在的行:
选择其他表中不存在的行
而且不要忘了删除重复 内 插入设置为好,这将 不会 被排除半反连接WHERE NOT EXISTS ...
一次处理这两项的一种技术是EXCEPT
:
INSERT INTO tbl (col1, col2)
VALUES
(text 'v1', text 'v2') -- explicit type cast may be needed in 1st row
, ('v3', 'v4')
, ('v3', 'v4') -- beware of dupes in source
EXCEPT SELECT col1, col2 FROM tbl;
EXCEPT
没有关键字的话会ALL
折叠源中的重复行。如果您知道没有重复项,或者您不想静静地折叠重复项,请使用EXCEPT ALL
(或其他一种技术)。看:
通常,如果目标表 很大 ,则WHERE NOT EXISTS
结合使用DISTINCT
源表可能会更快:
INSERT INTO tbl (col1, col2)
SELECT *
FROM (
SELECT DISTINCT *
FROM (
VALUES
(text 'v1', text'v2')
, ('v3', 'v4')
, ('v3', 'v4') -- dupes in source
) t(c1, c2)
) t
WHERE NOT EXISTS (
SELECT FROM tbl
WHERE col1 = t.c1 AND col2 = t.c2
);
如果可以有很多骗子,则首先将其折叠在源中是值得的。否则,少使用一个子查询。
有关的:
在 Postgres 9.5* 或更高版本中使用PostgresUPSERT
实现: INSERT ... ON CONFLICT ...
*
INSERT INTO tbl (col1,col2)
SELECT DISTINCT * -- still can't insert the same row more than once
FROM (
VALUES
(text 'v1', text 'v2')
, ('v3','v4')
, ('v3','v4') -- you still need to fold dupes in source!
) t(c1, c2)
ON CONFLICT DO NOTHING; -- ignores rows with *any* conflict!
进一步阅读:
说明文件:
克雷格(Craig)针对UPSERT
问题的参考答案:
我想知道如何一次将数据批量插入MySQL数据库,我不知道怎么做。根据mvc单击提交按钮时插入表数据。 和来自另一个表我想将所有数据添加到另一个表中,和是只读的 检查这张照片 milkload jsp页面 Milkload模型类 MilkLoadDAO类
我一直在寻找一个解决方案,以最好地实现一个不插入,如果行已经存在。我读过很多不同的答案,我觉得有点超出我的水平。 例如,下面的文章是最大的结果:SQL Server Insert如果不存在,但我不明白为什么要使用这些变量,以及如何定义table1和Table2。有人能进一步解释一下吗,这样我就可以把它应用到我的情况中了?
我定义了2个具有单向一对多关系的实体: 在command.class中: 在StockDetails.class中: null
问题内容: 在插入数据库之前,我正在使用以下代码检查重复项。对我来说,重复的只考虑重复时,,,,和比赛。 每个值都是在执行此检查之前定义的,由于项目已经存在,所以我的结果总是返回。我转储了“ dupesql”并将命令复制/粘贴到phpmyadmin中,该计数返回0。 问题答案: 您要执行以下操作: 有关更多信息,请参见此处。
我需要在表中插入所有单元格的唯一数据。我的表有3列,如果所有3个单元格的值相同,我需要忽略insert。 例如,我有一个表:|column_1 | column_2 | column_3| 以及此表的值: |val 1|val 2|val 3| |val 1|val 2|val 5| |val 1|val 2|val 3| |val 1|val 2|val 3| 所以我只需要插入值1和2,因为3和