首页 > 解决方案 > 更换桌子的最佳方法

问题描述

我有一个从 csv 文件生成的数据库表运行的 Web 应用程序。

此表需要经常从 csv 更新。该表需要与 csv 完全匹配,即如果一条记录不再存在于 csv 中,则它应该不再存在于表中,或者应该被软删除。

这样做的正确方法是什么?

似乎最简单的方法是:

  1. 创建临时表
  2. 将 csv 导入临时表
  3. 删除直播表
  4. 将临时表重命名为实时表名

这将在应用程序中编写脚本,因此我认为停机时间不会像丢弃桌子和重命名那样花费太长时间,但这似乎不是最安全的做事方式,因为有时没有桌子存在。

我试图改为:

  1. 创建临时表
  2. 将 csv 导入临时表
  3. 使用临时表中的数据更新实时表中的记录
  4. 删除临时表中不存在的实时表中的记录

从理论上讲,这听起来更好,但速度极慢。第一种方法只需要几秒钟。第二种方法更新需要很长时间,我让它运行了10分钟然后取消它,因为它没有完成。

我做了这样的更新:

update table_name as t
set
  column1 = t.column1,
  column2 = t.column2,
  -- etc..
from table_name_temp

处理这种情况的正确方法是什么?

标签: sqlpostgresql

解决方案


您想要做的是将您的简单解决方案包装在事务中。这将确保您的步骤以原子方式执行。有关更多信息,请参见:https ://www.tutorialspoint.com/sql/sql-transactions.htm 。

Postgres 支持ALTER TABLE .. RENAME


推荐阅读