我想在不长时间锁定分区表的情况下向分区表添加主键。
对于常规表,我可以创建一个索引CONCURRENTLY
并将该索引提升为主键。对于分区表,每当我尝试这样做时,我都会得到错误:
Query 1 ERROR: ERROR: ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables
我看到的唯一替代方案是不并发使用,而是直接通过列调用主键的创建:
ALTER TABLE table_name ADD PRIMARY KEY (col1, col2);
然而,在我做这个锁定操作之前,我想问问这里是否有人知道另一种方法。
[edit]下面是我尝试的SQL代码:
-- Create an invalid index
CREATE UNIQUE INDEX main_iex ON ONLY table_name (uuid, accessed);
-- Create index on each partition
CREATE UNIQUE INDEX CONCURRENTLY part1_idx ON part1 (uuid, accessed);
CREATE UNIQUE INDEX CONCURRENTLY part2_idx ON part2 (uuid, accessed);
...
-- Attach the partition indexes to the invalid one created before
ALTER INDEX main_idx ATTACH PARTITION part1_idx;
ALTER INDEX main_idx ATTACH PARTITION part2_idx;
...
-- At this point my main_idx should be valid
-- Make a primary key using the main index that should be valid after indexing each partition
ALTER TABLE request_log ADD PRIMARY KEY USING INDEX request_log_uuid_accessed_idx;
-- Result is:
-- Query 1 ERROR: ERROR: ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables
[edit]这里是一个工作解决方案的SQL代码,在实现了@jjanes的建议之后。这个解决方案只有最短的分区表被锁定的时间:
-- For each partition:
CREATE UNIQUE INDEX CONCURRENTLY part1_idx ON part1 (uuid, accessed);
ALTER TABLE part1 ADD PRIMARY KEY USING INDEX part1_idx;
CREATE UNIQUE INDEX CONCURRENTLY part2_idx ON part2 (uuid, accessed);
ALTER TABLE part2 ADD PRIMARY KEY USING INDEX part2_idx;
...
-- After creating a primary key for each partition, creating a primary key for the partitioned table is very fast
ALTER TABLE table ADD PRIMARY KEY (uuid, accessed);
1条答案
按热度按时间9gm1akwq1#
你应该让我们看看你到底做了什么,而不是让我们去猜测。
看起来像是在主表上创建了一个唯一索引,然后试图将其提升为主键。相反,在每个分区上单独创建一个主键,然后只在主表上创建主键,而不指定要使用的索引,只指定列。该创建将只将所有现有分区主键合并到新的总主键中。而不需要建立任何索引。