如何安全地TRUNCATE并重新填充PostgreSQL中的表?

时间:2015-11-20 11:22:08

标签: spring postgresql

我的数据库中的一个表必须每天更新。 Web服务器每5秒主动查询该表。现在我不能简单地UPDATE表行因为一些约束,所以我需要清除所有行并重新填充表。如何在不影响Web服务器功能的情况下安全地执行此操作? 重新填充由与Web服务器隔离的其他Web服务完成。我正在使用Spring框架。

表格大约有。 170k行和5列。

1 个答案:

答案 0 :(得分:2)

在单个事务中截断并重新填充表。 对于并发读者来说,截断是不可见的,他们会继续查看旧数据。 @AlexanderEmelianov和the docs的更正:

  

TRUNCATE不是MVCC安全的。截断后,如果表使用在截断发生之前拍摄的快照,则表对于并发事务将显示为空。有关详细信息,请参阅Section 13.5

所以TRUNCATE txn提交之后,并发txns在之前启动 TRUNCATE会将表视为空。

任何在截断表后的事务将等到执行截断的事务提交或回滚。

BEGIN;

TRUNCATE TABLE my_table;

INSERT INTO my_table (blah) VALUES (blah), (blah), (blah);

COMMIT;

您也可以COPY代替INSERT。正常交易中的任何事情。

更好的是,PostgreSQL中的优化使得在截断之后填充表格比在其他情况下更快地填充表格。