Postgresql

在沒有表掃描的情況下向大表添加 NOT NULL 約束

  • October 31, 2018

嘗試向NOT NULL具有 10 億行的表添加約束。我不能承受超過幾秒鐘的表鎖。有沒有辦法在 alter table 語句期間防止全表掃描?我在列上創建了一個索引,希望它會被使用,但這似乎不起作用。可能是檢查約束?其他選擇?謝謝!

有沒有辦法在 alter table 語句期間防止全表掃描?

目前沒有支持使用 PostgreSQL 的安全方法來執行此操作。

某種ALTER TABLE ... ADD CONSTRAINT ... CONCURRENTLY會很好,但沒有人實施它。與添加NOT VALID仍然影響新行的約束的替代方法相同,然後您VALIDATE稍後會這樣做 - 這會很好,這是每個人都知道需要但沒有人有時間或資金來添加的東西。

理論上,如果您知道它是真實有效的,您可以直接修改系統目錄以添加約束。實際上,這通常不是一個好主意。

所以不,真的沒有辦法。

引用自:https://dba.stackexchange.com/questions/66840