我在Postgres有一个约1M行的表.此表中的一列存储SMALLINT数据.现在我需要在此列中存储大于我预期的数字.如何将现有列从SMALLINT转换为INTEGER?
您需要将列数据类型更改smallint为integer:
alter table T alter C type integer
Run Code Online (Sandbox Code Playgroud)
T和C分别是表和列名.
设置数据类型
此表单更改表的列的类型.涉及该列的索引和简单表约束将通过重新分析最初提供的表达式自动转换为使用新列类型.可选的COLLATE子句指定新列的排序规则; 如果省略,则排序规则是新列类型的默认值.可选的USING子句指定如何从旧的计算新列值; 如果省略,则默认转换与从旧数据类型转换为new的赋值相同.如果没有从旧类型到新类型的隐式或赋值转换,则必须提供USING子句.
请参阅ALTER TABLE文档.
正如 Ondrej 所说,您可以使用ALTER TABLE .. ALTER COLUMN ... TYPE INTEGER.
但是,这将触发全表重写,从而锁定表以防止在持续时间内发生所有并发写入或读取。对于大型表来说这可能非常耗时。
如果您需要避免这种情况,可以分阶段进行更改。
BEGIN,添加新的整数列和COMMIT。BEGIN事务并LOCK TABLE ... IN EXCLUSIVE MODE阻止并发插入。UPDATE表,将smallint数据复制到integer列。smallint列,将该integer列重命名为 的smallint名称,然后COMMIT。LOCK TABLE如果您愿意编写一个触发器,BEFORE INSERT OR UPDATE ON ... FOR EACH ROW将值从smallint列复制到integer任何INSERT或上的列,您甚至可以避免并允许并发写入UPDATE。您需要在创建新整数列的同一事务中添加此触发器,以便捕获与 big 同时添加的行UPDATE。为了进一步减少更改对应用程序的影响,您可以在单个事务中小批量更新行,从而避免长时间的行级锁定。
我在之前的 dba.SE 回答中写了更多相关内容。
| 归档时间: |
|
| 查看次数: |
5230 次 |
| 最近记录: |