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

标签 database postgresql insert transactions atomic

我想知道 PostgreSQL 多行 INSERT 是否安全(在系统/数据库发生故障时插入所有数据或不插入任何数据)。查询示例:

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

最佳答案

您自己的回答(现已删除)是对事物的误解。单个 INSERT 语句始终是原子的。您的示例 INSERT 有两行是全有或全无 - 两行都被插入或没有。

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

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

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 中,您从查询窗口立即发送的所有内容默认都包装到事务中。

关于database - PostgreSQL 多行插入是全有还是全无?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29357784/

相关文章:

php - 如何从数据库中选择任何特定项目并将其显示在不同的页面中

database - PostgreSQL 9.3 中 b/w pg_basebackup 和 TAR 备份(停止/启动)备份的区别?

postgresql - 是否可以在 postgresql 上的 FTS 中组合多个文本搜索配置?

Mysql查询问题,列不为空时插入行的情况

php - 如何使用 PHP 检查 SQL 数据库是否已有

sql - 设计条件关系

ruby-on-rails-3 - 无法获得 Postgres.app 连接

ruby-on-rails-3 - Gem Install PG 神秘报错extconf.rb相关

sql - nvarchar 值的转换溢出了用于从文件插入的 int 列

html - 在索引处的字符串中插入字符串(快速)