PostgreSQL ALTER COLUMN TYPE int to bigint 的持续时间

23

假设我有一个表,其中idINTEGER GENERATED BY DEFAULT AS IDENTITY类型的。

我想记录如何更改类型,如果将来integer太小,我需要将id类型从integer更改为bigint。我主要担心更改的时间复杂度,因为它可能会发生在表中的行数接近整型类型可以存储的最大数字时。

以下命令的时间复杂度是多少?

ALTER TABLE project ALTER COLUMN id TYPE BIGINT;
1个回答

19

这个命令将不得不重写整个表格,因为bigint需要8个字节的存储空间,而不是integer的4个字节。在执行此操作时,该表将被锁定以防止并发访问,因此对于大型表格,您应该准备好更长的停机时间。

如果您预计可能需要这样做,请在表格还很小的时候立即进行更改。


在Postgres 12中是否仍然如此?文档指出:添加具有易失性默认值的列或更改现有列的类型将需要重写整个表及其索引。作为例外,当更改现有列的类型时,如果USING子句不更改列内容,并且旧类型可以二进制强制转换为新类型或是新类型上的无约束域,则不需要重写表;但是,任何受影响列上的索引仍必须重建。 - Matthias Lohscheidt
1
@MatthiasLohscheidt,大小为4的数据类型永远无法被强制转换为长度为8的数据类型。二进制可强制转换意味着存储格式是相同的。有更复杂的方法可以实现目标,而不需要停机,但不能使用简单的“ALTER TABLE”。 - Laurenz Albe
感谢 @Laurenz Albe 的澄清!我不确定“无限制域”是什么意思,但现在我猜它指的是域类型(最终仍然是二进制可强制转换的)。 - Matthias Lohscheidt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接