我有一个具有唯一索引的表:
CREATE UNIQUE INDEX IF NOT EXISTS tb_sha256_key_idx ON blob_props (sha256, key);
我想在数据库迁移时将其更改为主键,有两种方法:
ALTER TABLE tb ADD CONSTRAINT tb_pkey PRIMARY KEY USING INDEX tb_sha256_key_idx;
DROP INDEX tb_sha256_key_idx
进而ALTER TABLE tb ADD PRIMARY KEY (sha256, key);
sha256
并且key
不是空列(所以它应该可以正常工作)。
我对这两种方法有一些担忧,我正在争论哪一种是数据库迁移期间使用的正确方法:
第二种方法更好,因为通过删除/创建,我们将显着提高索引聚类因子及其由于碎片而产生的大小。从性能的角度来看,这是更可取的。但是在大表上创建索引会导致临时文件很大(这就是为什么我们大多数时候使用 REINDEX 并仅作为最后手段创建新索引)。
想要进一步讨论并获得有关该场景的一些主张和/或更多意见。
在生产系统中,停机时间更为重要。在大多数情况下,在构建新的 btree 时,您无法完全阻止(插入/更新/删除甚至选择)一个大表几个小时。因此,仅使用先前创建的唯一索引来更改主键。
在这种情况下,在构建新的 btree 时,我们不会阻止正常的选择/插入/更新/删除查询。
对于小表或当您不关心执行时间时 - 这并不重要。为了简单起见,请随意命令 DROP CONSTRAINT + ADD PRIMARY KEY。
主键的所有部分都不能为空。
ADD PRIMARY KEY
将尝试隐式添加not null
。如果某些元组不是这样,迁移将返回错误。这没有任何意义。reindex 命令使用与 create index 命令相同的索引构建代码。有效地重新索引索引是在一个命令中创建索引+删除索引。