我有一个网络应用程序正在运行从 csv 文件生成的数据库表。
此表需要经常从 csv 更新。该表需要与 csv 完全匹配,即如果 csv 中不再存在记录,则该记录不应再存在于表中或应被软删除。
执行此操作的正确方法是什么?
看起来最简单的方法是:
- 创建临时表
- 导入 csv 到临时表
- 删除事件表
- 将临时表重命名为实时表名
这将在应用程序内部编写脚本,因此我认为停机时间不会像删除表和重命名那样花太多时间,但它似乎不是最安全的做事方式,因为有一段时间不存在表的地方。
我尝试改为:
- 创建临时表
- 导入 csv 到临时表
- 使用临时表中的数据更新实时表中的记录
- 删除事件表中临时表中不存在的记录
理论上听起来更好,但速度非常慢。第一种方法只需要几秒钟。第二种方法更新需要很长时间,我让它运行了 10 分钟,然后取消它,因为它还没有完成。
我是这样更新的:
update table_name as t
set
column1 = t.column1,
column2 = t.column2,
-- etc..
from table_name_temp
处理这种情况的正确方法是什么?
最佳答案
您要做的是将您的简单解决方案包装在事务中。这将确保您的步骤以原子方式执行。请参阅:https://www.tutorialspoint.com/sql/sql-transactions.htm了解更多信息。
Postgres 支持 ALTER TABLE .. RENAME
.
关于sql - 更换 table 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52049943/