sql - 更换桌子的最佳方法
问题描述
我有一个从 csv 文件生成的数据库表运行的 Web 应用程序。
此表需要经常从 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
。
推荐阅读
- r - 随机游走自相关函数的 3D 图
- symfony - easyadmin 实体字段的动态自定义选择
- python - 旋转图像后更新 cv::rect
- javascript - JavaScript GetElementById 为 Null 但元素有值
- oracle - 多对多关系表不工作无法从中删除值
- r - R无法使用Rcpp输入引号
- html - chrome 不支持 application/rtf 类型
- asp.net-mvc - 带有布局页面的部分视图加载
- python - Fargate,Lambda,另一种选择?我将什么用于自定义 python 作业?
- xml - SOAPUI SOAP 模拟错误:前缀不能以 XML 开头:XMLSchema-instance