Postgresql
從選擇中插入而不失去Postgresql中間的進度?“插入…選擇…其中…不存在(…)”
是否可以將數據移動到新表中以獲取其他表而不會在中間失去進度?
我認為
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 ...
. 衝突行動取決於未公開的細節。