sql - Postgres 事务中的 DROP TABLE 行为

标签 sql postgresql transactions ddl

假设我正在开发一个 ETL,它定期从 CSV 中读取源数据并替换 Postgres (9.6) 中的表。

这是一种方法:

BEGIN
DROP TABLE IF EXISTS table
CREATE TABLE table (...)
COPY table FROM STDIN (FORMAT csv, HEADER true)
CREATE INDEX ON table (...)
COMMIT

这是另一个:

BEGIN
CREATE TABLE table_temp (...)
COPY table_temp FROM STDIN (FORMAT csv, HEADER true)
CREATE INDEX ON table_temp (...)
DROP TABLE IF EXISTS table
ALTER TABLE table_temp RENAME TO table
COMMIT

我对以下内容是否正确?

  • 第一个事务将在 DROP 命令处锁定表,因此并发 SELECT 查询将阻塞,直到事务完成。
  • COPYCREATE INDEX 完成之前,第二个事务不会阻止 SELECT 查询。
  • 这两个事务都是原子的:在任何一种情况下,如果我发出 ROLLBACK 而不是 COMMIT,该表将恢复所有原始数据和索引。

另外,除了索引的名称之外,还有其他功能上的区别吗?

最佳答案

是的,您的所有 3 个假设都是正确的。

两个事务的最终结果是相同的,但是第一个事务导致的阻塞会更长,并且取决于数据量和创建索引所需的时间。第二个事务需要一个非常简短的锁来重命名对象。

关于sql - Postgres 事务中的 DROP TABLE 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44395561/

相关文章:

postgresql - 在 Postgresql 中强制 DROP

sql - 如果没有销售,则为零

SQL Server 2008 R2 全文搜索与 FORMOF 和重音不敏感

给出匹配多列的不同结果的 SQL 查询

java - 数据库编码更改为 UTF8 导致 java.lang.NullPointerException

c - 如何使用 libpqtype 从插入返回 id

java - 回滚 ORMapper 查询

php - 如果我只执行一个查询,那么使用事务的好处是否足够重要?

postgresql - 将 postgreSQL 存储过程作为一个事务执行

sql - 为什么 "non exists"SQL 查询有效而 "not in"无效