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 中一次性发送的所有内容都默认打包到事务中。
我想知道 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 中一次性发送的所有内容都默认打包到事务中。