sql – 插入多行时重复项会发生什么?

前端之家收集整理的这篇文章主要介绍了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;

EXCEPT没有关键字ALL折叠源中的重复行.如果您知道没有欺骗,除了所有或其他一种技术将更快.有关:

> 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 ... 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'),'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?
> How do I insert a row which contains a foreign key?

文档:

> The manual
> The commit page
> The Postgres Wiki page

Craig对UPSERT问题的参考答案:

> How to UPSERT (MERGE,INSERT … ON DUPLICATE UPDATE) in PostgreSQL?

原文链接:https://www.f2er.com/mssql/79770.html

猜你在找的MsSQL相关文章