主键违规错误后继续事务

2024-01-02

我正在从日志文件将记录批量插入数据库。有时(每千行中约有 1 行)其中一行违反了主键并导致事务失败。目前,用户必须手动检查导致失败的文件并删除有问题的行,然后才能尝试重新导入。鉴于有数百个这样的文件需要导入,这是不切实际的。

我的问题:如何跳过违反主键约束的记录插入,而不必执行SELECT在每行之前声明以查看它是否已经存在?

注意:我知道有一个非常相似的问题#1054695 https://stackoverflow.com/questions/1054695/continue-after-primary-key-violation-error,但这似乎是 SQL Server 特定的答案,我正在使用 PostgreSQL(通过 Python/psycopg2 导入)。


您还可以在事务中使用 SAVEPOINT。

Pythonish 伪代码从应用程序端进行说明:

database.execute("BEGIN")
foreach data_row in input_data_dictionary:
    database.execute("SAVEPOINT bulk_savepoint")
    try:
        database.execute("INSERT", table, data_row)
    except:
        database.execute("ROLLBACK TO SAVEPOINT bulk_savepoint")
        log_error(data_row)
        error_count = error_count + 1
    else:
        database.execute("RELEASE SAVEPOINT bulk_savepoint")

if error_count > error_threshold:
    database.execute("ROLLBACK")
else:
    database.execute("COMMIT")

编辑:这是 psql 中的一个实际示例,基于文档中示例的细微变化(SQL 语句以 ">" 为前缀):

> CREATE TABLE table1 (test_field INTEGER NOT NULL PRIMARY KEY);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "table1_pkey" for table "table1"
CREATE TABLE

> BEGIN;
BEGIN
> INSERT INTO table1 VALUES (1);
INSERT 0 1
> SAVEPOINT my_savepoint;
SAVEPOINT
> INSERT INTO table1 VALUES (1);
ERROR:  duplicate key value violates unique constraint "table1_pkey"
> ROLLBACK TO SAVEPOINT my_savepoint;
ROLLBACK
> INSERT INTO table1 VALUES (3);
INSERT 0 1
> COMMIT;
COMMIT
> SELECT * FROM table1;  
 test_field 
------------
          1
          3
(2 rows)

请注意,值 3 是在错误之后插入的,但仍在同一事务中!

SAVEPOINT 的文档位于http://www.postgresql.org/docs/8.4/static/sql-savepoint.html http://www.postgresql.org/docs/8.4/static/sql-savepoint.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

主键违规错误后继续事务 的相关文章

  • 使用 libpqxx 批量存储数据或如何在 libpqxx 中使用 COPY 语句

    要在 PostgreSQL 中插入批量数据 填充数据库 最快的方法是使用 COPY Source https stackoverflow com questions 758945 whats the fastest way to do a
  • 用户表到用户和用户首选项。这是正常化了吗?

    我有一张桌子叫Users其偏好列表不断增加 这些首选项可以包括 ReligionId 它将连接到另一个包含宗教列表的表 偏好列表正在不断增加 我想把它分开Users表分成2个表 我认为行之有效的策略是制作一个单独的表 名为UserPrefe
  • T-SQL参数嗅探重新编译计划

    我有 SQL 命令 exec sp executesql N SELECT TOP 10 FROM mytableView WHERE Name LIKE Value0 ORDER BY Id DESC N Value0 varchar 5
  • 导轨中的多个 DB 连接

    我正在尝试在 ROR 应用程序中连接多个数据库 我的 database yml 如下所示 在你的database yml文件中 发展 adapter mysql username root password database example
  • 通过 R 连接到 Azure SQL

    下面的代码允许我通过 R 连接到 Azure SQL 服务器 但是 我只能访问 主 数据库 而不能访问我在下面创建的两个数据库 表格显示为空白 有什么想法吗 谢谢 library RODBC library dplyr library DB
  • 我什么时候应该创建数据库索引? [复制]

    这个问题在这里已经有答案了 何时为表设置索引 是在创建表期间还是在性能调优时 索引的优点和缺点是什么 许多 大多数 DBMS 使用索引来支持唯一约束 始终创建索引以强制执行唯一约束 它们 约束 对于数据库的正确操作至关重要 如果您可以选择如
  • Web SQL 将数据插入多行

    我尝试在 Web SQL 数据库中一次将变量插入多行 但使用我所知的所有方法时 我收到错误 INSERT INTO tab a b VALUES v1 v2 v3 v4 gt gt could not prepare statement 1
  • 在无法接受集合的上下文中调用的集值函数

    我收到错误 在无法接受集合的上下文中调用的集值函数 当执行这个函数时RETURN QUERY EXECUTE line PLSQL cat lookup email pl CREATE OR REPLACE FUNCTION app loo
  • 将查询结果作为 CSV 文件从 Docker PostgreSQL 容器导出到本地计算机

    我不确定这是否可能 或者我是否做错了什么 因为我对 Docker 还很陌生 基本上 我想将 PostgreSQL docker 容器内的查询结果作为 csv 文件导出到本地计算机 这就是我到目前为止所得到的 首先 我使用以下命令运行 Pos
  • Spring Boot data-jpa 和 nativeQuery Postgres 转换

    我有一个习惯 Query在一个看起来像这样的存储库中 SELECT FROM topicaudit c14001 WHERE auditdate gt NOW AND auditdate lt NOW 1 hour INTERVAL AND
  • CHAR(64) 或 BINARY(32) 在 SQL SERVER 中存储 SHA256 哈希

    我正在讨论在 SQL Server 中存储 SHA256 哈希时使用哪种数据类型 应该是 CHAR 64 还是 BINARY 32 该列将成为唯一聚集索引的一部分 我知道此时我可能会吹毛求疵 但是我想第一次就把这件事做好 而且我知道有时原始
  • BIT(1) 的存储大小是多少?

    我一直认为a的存储大小BIT 1 列为 1 位 But http dev mysql com doc refman 5 6 en storage requirements html http dev mysql com doc refman
  • 如何在嵌套集中查找特定 level2 节点的特定子节点

    我有一个标准的嵌套集模型 每个节点都有 name lft 和 rgt 属性 我可以使用以下方法找到特定员工的上级 SELECT P2 FROM Personnel AS P1 Personnel AS P2 WHERE P1 lft BET
  • 将日期时间列拆分为年、月和周

    我想拆分日期时间列 以便年份和月份在 select 语句输出中都有自己的列 我还希望有一个按一年中的一周而不是特定日期的专栏 基本上 我希望单独的年 月和周列显示在我的 select 语句输出中 尝试使用DatePart http msdn
  • 两个表中两个字段的总和

    我的数据库中有四个表 如下所示 表格发票 invcid customerid invoicedate tblInvc详细信息 ID invcid item itemprice itemquantity tblPay payid invcid
  • 使用 java 中的准备好的语句插入自定义 SQL 类型

    我有一些自定义类型 它们基本上都是枚举 以下是它们的外观示例 CREATE TYPE card suit AS ENUM spades clubs hearts diamonds 我在 Java 中有一些准备好的语句 看起来像这样 Setu
  • 如何复制身份列中的数据?

    我有一张桌子identity列在一台服务器中 并且在另一台服务器中有一个具有相同结构的其他表 现在我想将所有数据从一个表复制到另一个表 但我无能为力 我已经创建了一个链接服务器 我用这个 insert into server databas
  • 如何使用JSqlParser向sql添加where条件?

    我想用JSqlParser向sql添加where条件 例如 Before select from test table where a 1 group by c After select from test table where a 1
  • WHERE 子句中的可选参数[重复]

    这个问题在这里已经有答案了 假设有一个具有 3 个参数的存储过程 在所有可能性中 我希望通过一个单一的方法来实现这一目标WHERE子句不会失去对 using 的控制 AND OR 太多了 Example Params CITY VARCHA
  • 在 SQL 中用加号 (+) 显示正结果

    我有以下查询 SELECT CONVERT DECIMAL 11 1 SUM Column 1000 1 AS NAME FROM Table 我有 1000 1 的原因是我希望结果以千为单位显示并反转 负值作为正值 反之亦然 只有一位小数

随机推荐

  • “docker images ls”有什么作用?

    我查阅了文档以了解命令之间的区别docker image 管理图像 和docker images 列出图像 所以第二个选项似乎是一个捷径docker image ls其中还列出了图像 我注意到的是 跑步时docker image ls or
  • 跨 Node.js 和 nginx 的身份验证

    由于我的大部分内容都是静态的 我计划让 nginx 来处理静态文件的服务 但静态内容也是私有的 不同的用户有不同的内容 应用程序本身是用node js express js编写的 我想知道我应该如何处理身份验证 授权 有没有什么 任何 ng
  • 在 Amazon EC2 中,如何将 EBS 卷复制到另一个用户?

    我已经使用我的亚马逊凭证创建了一个亚马逊 EBS 卷 我的客户向我提供了他的客户凭证 以便我为他创建一台 EC2 机器并附上我创建的磁盘 我该怎么做 如果重要的话我正在使用网络控制台 让我补充一点 当我在客户的帐户中创建卷并将快照 ID 设
  • 找不到“Google/Analytics.h”文件 - XCode 7

    我在将 Google Analytics SDK 集成到我的 iOS 项目中时遇到很多麻烦 我正在使用 XCode 7 并针对 iOS 7 使用 Swift 2 0 不过我可以让示例正常工作 尽管没有转换为 Swift 2 0 我尝试过通过
  • 如何使用 MATLAB 自动填充任意图像?

    这是基于此答案的进一步问题 如何在 MATLAB 中实现鱼眼镜头效果 桶形变换 https stackoverflow com questions 2589851 how can i implement this visual effect
  • Android - 警报有时在很长一段时间后不会触发

    我的应用程序有一个大问题已经好几天了 如果我的英语事先不是那么地道 我深表歉意 我实现了一个 AlarmManager 让我的应用程序的用户可以选择在当前或第二天的任何时间启动特定服务 所以例如用户可能选择将我的服务时间设置为明天上午 08
  • 如何在 Rails 中使用 Resque 指定用于所有作业的默认队列?

    我希望所有排队调用都默认到某个队列 除非另有指定 这样它是 DRY 并且更易于维护 为了指定一个队列 文档说要在类中定义一个变量 queue X 所以 我尝试执行以下操作 但没有成功 有什么想法吗 class ResqueJob class
  • deno 捆绑失败。类型“ReadableStream”上不存在属性“getIterator”

    使用捆绑包运行 deno 失败并出现以下错误 error TS2339 ERROR Property getIterator does not exist on type ReadableStream
  • 将 matplotlib 子图保存到图像文件

    我对matplotlib我一瘸一拐地走着 也就是说 我还没有找到这个问题的明显答案 我有一个散点图 我想按组着色 它看起来像通过循环绘制 https stackoverflow com questions 21654635 scatter
  • Hibernate 使用一级或二级缓存加载所有实体

    我们有一个完整的实体表 需要在休眠会话期间加载 而我知道加载所有实体的唯一方法是通过 HQL 查询 public
  • 打破嵌套循环

    有人可以告诉我当我有嵌套循环时如何打破主循环吗 例子 Main loop for int y 0 y lt 100 y 10 Sub loop for int x 0 x lt 100 x 10 if x 60 Break the main
  • 使用CloudFlare、Heroku、RoR时如何设置真实IP地址?

    我最近刚刚开始使用 CloudFlare 但仍然存在获取 CloudFlare 的代理 IP 地址而不是访问者地址的挥之不去的问题 CloudFlare 有很多解决方案 https support cloudflare com hc en
  • SQL 自定义 Order By 子句

    一个简单的问题 我有一个查询返回 2 列 描述 和 金额 在描述中我们有 3 个结果 黄金 拥有 青铜 无土地 和 白银 已识别 提供 我希望结果按以下顺序显示 金 银 铜 按升序或降序排序无法实现此目的 有没有办法自定义 Order by
  • 在 Angular 中使用 AngularJS 服务

    我正在寻找 Angular 项目中包含 AngularJS 服务 这是我的 main ts import platformBrowserDynamic from angular platform browser dynamic import
  • auth.User.groups:(fields.E304)“User.groups”的反向访问器与“UserManage.groups”的反向访问器冲突

    在我的 Django 项目中 我有一个user manage app 我创建了一个名为UserManage in my user manage应用程序的model py from django db import models from d
  • 返回 Bash 脚本中的正则表达式匹配项,而不是替换它

    我只想匹配 Bash 脚本中的一些文本 我尝试过使用 sed 但我似乎无法让它只输出匹配项而不是用某些东西替换它 echo E TestT100String sed s 0 9 dontReplace g 哪个会输出TestTdontRep
  • 我如何知道 PDF 页面是彩色还是黑白?

    给定一组 PDF 文件 其中一些页面是彩色的 其余页面是黑白的 是否有任何程序可以找出给定页面中哪些页面是彩色的 哪些页面是黑白的 例如 这在打印论文时很有用 并且只需花费额外的费用来打印彩页 对于考虑双面打印并将适当的黑白页面发送到彩色打
  • R:使用 rvest 包而不是 XML 包从 URL 获取链接

    我使用 XML 包来获取链接this url http www bvl com pe includes empresas todas dat Parse HTML URL v1WebParse lt htmlParse v1URL Read
  • 在圆形叠加层中绘制文本

    我正在尝试在 MKMapView 上绘制一些包含文本的圆形叠加层 我对 MKCircleView 进行了子类化 在其中放置了以下内容 基于this https stackoverflow com questions 4165842 draw
  • 主键违规错误后继续事务

    我正在从日志文件将记录批量插入数据库 有时 每千行中约有 1 行 其中一行违反了主键并导致事务失败 目前 用户必须手动检查导致失败的文件并删除有问题的行 然后才能尝试重新导入 鉴于有数百个这样的文件需要导入 这是不切实际的 我的问题 如何跳