Postgresql
postgres如何修改複合主鍵順序
我想修改複合主鍵順序,例如從
(col_b, col_a)
to ,(col_a, col_b)
因為我想使用前綴列(即col_a
)進行查詢,並且想利用主鍵索引。我嘗試這樣做的方法是:
- 刪除 pk 約束
ALTER TABLE <table_name> DROP CONSTRAINT <table_name>_pkey;
- 以正確的順序添加回來
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;
這仍然會在桌子上進行強力鎖定(其中幾個在不同的時間),但應該只將每個鎖定保持一小部分時間。但是,如果鎖定嘗試阻塞很長時間,這仍然會導致問題。