sql – 插入多行时一再项会产生什么?
我正在运行一个 python剧本,将大量数据插入到Postgres数据库中,我行使单个查询来执行多行插入: INSERT INTO table (col1,col2) VALUES ('v1','v2'),('v3','v4') ... etc 我想知道假如它遇到插入的一再键会产生什么.它会遏制整个查询并抛出非常吗?可能它只是忽略该特定行的插入并继承提高? 办理要领INSERT将只插入全部行,而且不会产生任何非凡环境,除非您有某种 constraint榨取一再/重叠值(PRIMARY KEY,UNIQUE,CHECK或EXCLUDE束缚) – 您在题目中未说起.但这就是你也许担忧的工作.假设(col1,col2)上有UNIQUE或PK束缚,则暗示您正在处理赏罚教科书UPSERT环境.在这里找到很多相干的题目和谜底. 凡是,假如违背任何束缚,则会激发非常(除非陷入像plpgsql这样的进程处事器端说话),不只会回滚语句,还会回滚整个事宜. 没有并发写入 即:没有其他事宜会实行同时写入统一个表. >行使WHERE NOT EXISTS …或任何其他合用技能解除表中已有的行: > Select rows which are not present in other table >而且不要健忘删除插入荟萃中的一再项,这不会被半反毗连WHERE NOT EXISTS解除… 同时处理赏罚这两种技能的一种要领是: INSERT INTO tbl (col1,col2) VALUES (text 'v1',text 'v2') -- explicit type cast may be needed in 1st row,'v4'),'v4') -- beware of dupes in source EXCEPT SELECT col1,col2 FROM tbl;
> Using EXCEPT clause in PostgreSQL 凡是,假如方针表很大,那么与源上的DISTINCT团结行使的WHERE NOT也许会更快: INSERT INTO tbl (col1,col2) SELECT * FROM ( SELECT DISTINCT * FROM ( VALUES (text 'v1',text'v2'),'v4') -- dupes in source ) t(c1,c2) ) t WHERE NOT EXISTS ( SELECT 1 FROM tbl WHERE col1 = t.c1 AND col2 = t.c2 ); 假如可以有许多诱骗,那么起首在源中折叠它们是值得的.不然行使一个子查询. 有关: > Select rows which are not present in other table 行使并发写入 在Postgres 9.5或更高版本中行使Postgres UPSERT实现 INSERT INTO tbl (col1,col2) SELECT DISTINCT * -- still can't insert the same row more than once FROM ( VALUES (text 'v1',text 'v2'),'v4') -- you still need to fold dupes in source! ) t(c1,c2) ON CONFLICT DO NOTHING; -- ignores rows with *any* conflict! 更具体的相干谜底: > How to use RETURNING with ON CONFLICT in PostgreSQL? 文档: > The manual Craig对UPSERT题目的参考谜底: > How to UPSERT (MERGE,INSERT … ON DUPLICATE UPDATE) in PostgreSQL? (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |