没有唯一键的Pg_repack表

问题描述 投票:0回答:1

我有以下问题:我有一张桌子,当然是在产品上。。。在某个时候,我们遇到了INT pk的限制,因此我们默认将其修改为-1。现在,我想在其上运行pg_repack,但是这需要没有NULL和唯一键。你有什么经验吗?我的选择:1.抽真空。不能,因为影响。2.添加一些额外的唯一列,可能会花费一些时间和影响。也可以破坏select *查询。3.添加具有默认值的列,然后使用序列号更新并标记为唯一。以前从未尝试过。AWS RDS。

postgresql unique-key
1个回答
0
投票

将始终对性能产生影响,您的目标是使ACCESS EXCLUSIVE锁越短越好。

所以

  • 添加没有默认值的bigint

  • 创建序列OWNED BY新列

  • 使用ALTER TABLE使用序列设置列的默认值

  • 更新序列中新列中的NULL值

    您应该分批执行此操作,以避免一次锁定太多行。

  • 在新列CONCURRENTLY上创建唯一索引

  • 使用新索引添加唯一约束

这不会给您主键,因为您仍然缺少NOT NULL约束。如果不扫描整个表就无法设置列NOT NULL,这将使ACCESS EXCLUSIVE锁定时间更长。但是,如果您需要真正的主键,则无法避免。

这是我在SQL中使用示例表的过程:

ALTER TABLE x ADD id bigint;

CREATE SEQUENCE x_id_seq OWNED BY x.id;

ALTER TABLE x ALTER id SET DEFAULT nextval('x_id_seq');

UPDATE x SET id = nextval('x_id_seq')
WHERE id IS NULL
  AND somecol BETWEEN 1 AND 10000;
UPDATE x SET id = nextval('x_id_seq')
WHERE id IS NULL
  AND somecol BETWEEN 10001 AND 20000;
...

CREATE UNIQUE INDEX CONCURRENTLY x_id_idx ON x(id);

ALTER TABLE x ADD UNIQUE USING INDEX x_id_idx;

我希望下次您对它有所了解,并且永远不会再创建没有主键的表。

© www.soinside.com 2019 - 2024. All rights reserved.