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

ADT*_*DTC 4 sql postgresql primary-key composite-primary-key postgresql-9.1

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

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

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

例如,采用具有主键的表,如下所示:

PRIMARY KEY (col1, col2, col3, col4)
Run Code Online (Sandbox Code Playgroud)

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

PRIMARY KEY (col4, col1, col2, col3)
Run Code Online (Sandbox Code Playgroud)

Pat*_*ick 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;
Run Code Online (Sandbox Code Playgroud)

替换主键时存在一些"停机时间",但这相对较小.在创建新索引时完成了艰苦的工作,但这可以在事务块之外完成.构建索引时会捕获任何问题,因此在输入事务块之前会启动"停机".索引有效时,快速替换主键.