是否可以将数据移动到新表中以获取其他表而不会在中间丢失进度?
我认为plpgsql
在每 N 次插入后按块读取数据并提交......如果过程在中间停止,则条件NOT EXISTS (...)
允许通过再次重复过程来添加丢失的数据。
我认为它是重要的模式,并且可能直接使用以下语法支持它:
INSERT INTO ... SELECT ... WHERE ... AND NOT EXISTS (...)
复制中断的原因可能是约束或用户暂停操作。我们仍然希望不丢失进度和恢复过程(在NOT EXISTS (...)
警卫的帮助下)。
如果是关于用户“暂停”操作,a
PROCEDURE
或DO
语句可能是正确的选择(Postgres 11+)。INSERT
一次N行,COMMIT
每次迭代后。看:如果源是稳定的,并且您可以跟踪不断增加的最小 ID 或类似的东西,那么在中断后接听可能会更便宜。
但是,如果它只是一个在违反时可能引发异常的约束,请使用 UPSERT 查询来解决冲突:
INSERT .. ON CONFLICT ...
. 冲突行动取决于未公开的细节。