更改复合主键列顺序,避免在没有主键的情况下暴露表

时间:2014-03-22 05:55:34

标签: sql postgresql primary-key postgresql-9.1 composite-primary-key

如果不删除主键索引并重新创建它,如何更改表上的复合主键?

我希望能够更改主键列顺序并让它重新编制索引并立即在单个语句中应用 (这样主键没有“停机时间”)

如果无法在单个语句中执行此操作,那么在单个事务中执行此操作的最佳方法是什么,以便在没有主键的情况下,表在任何时间段内都不会被访问?< / p>

例如,使用具有主键的表格如下:

PRIMARY KEY (col1, col2, col3, col4)

我想将订单更改为(但不添加或删除列):

PRIMARY KEY (col4, col1, col2, col3)

1 个答案:

答案 0 :(得分:7)

单一声明无法做到这一点。您需要一个事务块来执行此操作:

-- Create a new index for the new primary key.
CREATE UNIQUE INDEX new_index_name ON table_name (col4, col1, col2, col3);

-- Now enter a transaction block to replace the primary with the new one.
BEGIN;
ALTER TABLE table_name DROP CONSTRAINT pkey_name; -- old index is automatically dropped with the constraint
ALTER TABLE table_name ADD CONSTRAINT constr_name PRIMARY KEY USING INDEX new_index_name;
COMMIT;

有一些&#34;停机时间&#34;在更换主键时,这个相对较小。在创建新索引时完成了艰苦的工作,但这可以在事务块之外完成。在构建索引时会捕获任何问题,因此在输入事务块之前和您的停机时间是#34;开始。当索引有效时,快速替换主键。