更换桌子的最佳方法

时间:2018-08-28 04:10:07

标签: sql postgresql

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

此表需要经常从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

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

2 个答案:

答案 0 :(得分:1)

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

Postgres支持ALTER TABLE .. RENAME

答案 1 :(得分:0)

重命名表方法仅在没有约束或触发器的情况下有效。

在大多数情况下,新表的内容与旧版本的差别不会太大;诀窍是禁止不做任何更改的更新。

步骤:


  • 创建临时表
  • 将csv导入到临时表

  • 从活动表中删除临时表中不存在的记录#删除

  • 删除临时表中的记录 ,它们与实时表#幂等更新中的完全相同
  • 使用临时表#实际的更新
  • 中的数据更新实时表中的记录
  • 将不存在的临时表中的记录插入实时表中#插入