sql - 更换 table 的最佳方法

标签 sql postgresql

我有一个网络应用程序正在运行从 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

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

最佳答案

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

Postgres 支持 ALTER TABLE .. RENAME .

关于sql - 更换 table 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52049943/

相关文章:

sql - RowNumber() 和 SUM() 在一个查询中

sql - "$$ 处或附近未终止的美元引号字符串

mysql - 在提供额外选择的同时对查询进行分组

sql - 根据一列的最高值和另一列的条件获取行

java - 如何在 hibernate 状态下更新?

sql - Postgresql:错误:无法识别的连接类型:7

database - 如何使用 Django 执行 SQL LEFT JOIN?

sql - 返回任意类型的 PostgreSQL 函数

sql - PostgreSQL 查找按日期分组的前 N ​​行

sql - 如何从 .t​​sv 文件的特定列中获取数据到 Postgres 数组列中?正则表达式是正确的工具,还是我应该寻找另一种方法?