Postgresql

postgres如何修改複合主鍵順序

  • July 21, 2022

我想修改複合主鍵順序,例如從(col_b, col_a)to ,(col_a, col_b)因為我想使用前綴列(即col_a)進行查詢,並且想利用主鍵索引。

我嘗試這樣做的方法是:

  1. 刪除 pk 約束
ALTER TABLE <table_name> DROP CONSTRAINT <table_name>_pkey;
  1. 以正確的順序添加回來
ALTER TABLE <table_name> ADD PRIMARY KEY (col_a, col_b);

這是正確的方法嗎?這會清理舊索引並創建新索引(這是我想要的行為)嗎?

這會起作用,但有可能有人會在這兩個語句之間抓住你並插入非法值。如果您在一個事務中執行它們,您將通過在表上保持一個無間隙的鎖來排除這種情況。但它也會在建構新索引時阻止其他工作。

所以如果你不想有一個維護視窗,你可以這樣做:

create unique index concurrently new_key on foo (col_a,col_b);
begin;
alter table foo drop constraint foo_pkey ;
alter table foo add constraint foo_pkey primary key using index new_key;
commit;

這仍然會在桌子上進行強力鎖定(其中幾個在不同的時間),但應該只將每個鎖定保持一小部分時間。但是,如果鎖定嘗試阻塞很長時間,這仍然會導致問題。

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