PostgreSQL 多行插入是全有还是全无?

Is PostgreSQL multi-row insertion all or nothing?

我想知道 PostgreSQL 多行 INSERT 是否安全(插入所有数据或在 system/database 失败的情况下不插入数据)。查询示例:

INSERT INTO "tests" ("name") VALUES ('1'), ('2')

您自己的回答(现已删除)误解了事情。单个 INSERT 语句 始终是原子的 。您的示例 INSERT 有两行是 all or nothing - 两行都被插入或 none.

是否启用自动提交取决于您的客户端。

psql 中默认启用自动提交。这意味着每个 statement 都作为自己的事务运行,除非您将(任意数量的)语句包装到显式事务包装器中。所以这是 "all or nothing":

INSERT INTO test (name) VALUES ('1'), ('2');

就像这样:

BEGIN;
INSERT INTO test (name) VALUES ('1');
INSERT INTO test (name) VALUES ('2');
COMMIT;

但不是这个:

INSERT INTO test (name) VALUES ('1');
INSERT INTO test (name) VALUES ('2');

pgAdmin 中,您从查询 window 中一次性发送的所有内容都默认打包到事务中。