gpt4 book ai didi

performance - 在 PostgreSQL 中填充数据库

转载 作者:行者123 更新时间:2023-11-29 11:48:41 25 4
gpt4 key购买 nike

PostgreSQL 文档手册上的以下链接http://www.postgresql.org/docs/8.3/interactive/populate.html说要在 postgreSQL 中禁用自动提交,你可以简单地将所有插入语句放在 BEGIN 中;并提交;

但是,我很难捕获 BEGIN 之间可能发生的任何异常;犯罪;如果发生错误(例如尝试插入重复的 PK),我将无法显式调用 ROLLBACK 或 COMMIT 命令。尽管所有插入语句都会自动回滚,但 PostgreSQL 仍然希望在它可以认为事务终止之前显式调用 COMMIT 或 ROLLBACK 命令。否则,脚本必须等待事务超时,此后执行的任何语句都会引发错误。

在存储过程中,您可以使用 EXCEPTION 子句来执行此操作,但同样不适用于我执行批量插入的情况。我试过了,异常 block 对我不起作用,因为在错误发生后执行的下一条语句无法执行,并出现错误:

ERROR:  current transaction is aborted, commands ignored until end of transaction block

事务保持打开状态,因为它尚未通过调用 COMMIT 或 ROLLBACK 明确完成;

这是我用来测试它的代码示例:

BEGIN;
SET search_path TO testing;
INSERT INTO friends (id, name) VALUES (1, 'asd');
INSERT INTO friends (id, name) VALUES (2, 'abcd');
INSERT INTO friends (id, nsame) VALUES (2, 'abcd'); /*note the deliberate mistake in attribute name and also the deliberately repeated pk value number 2*/
EXCEPTION /* this part does not work for me */
WHEN OTHERS THEN
ROLLBACK;
COMMIT;

当使用这种技术时,我真的必须保证所有语句都会成功吗?为什么会这样?有没有办法捕获错误并显式调用回滚?

谢谢

最佳答案

如果您在开始和提交之间执行此操作,那么在出现异常时所有内容都会自动回滚。摘自您发布的网址:“在一个事务中执行所有插入的另一个好处是,如果一行的插入失败,那么插入到该点的所有行的插入将被回滚,因此您不会被部分加载的数据所困。 "

关于performance - 在 PostgreSQL 中填充数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9945671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com