我想提高一个包含1000万以上记录的大型表格中数字列的精度。标准方式是ALTER TABLE mytable ALTER COLUMN mycolumn TYPE numeric(15,6)
将锁定表。这是一个高度交易的表格。有没有办法做到这一点,而不锁定表,不重新创建表,复制数据,重命名/交换表?我目前正在运行一个dockerized postgres 9.5在不锁定表格的情况下提高数字数据类型的精度
回答
我没有想到改变typmod需要一个完整的表重写,但一个快速检查表明,如果你在finish_heap_swap
设置断点,它实际上是做一个重写cmd像ALTER TABLE test_numeric ALTER COLUMN x TYPE numeric(8,4)
- 至少在9.5。
编辑:a_horse_with_no_name指出,如果你改变了精度,而不是规模重写时,才会执行。所以你可以用短暂的独占锁来做到这一点,它不会大大干扰操作。
否则:
你可能欺骗和直接更新系统目录,因为你知道新精密的有效期为与老精度都行。但是我有点犹豫,因为如果这很简单,PostgreSQL可能已经做到了。我不能推荐它,但如果你想实验,测试,做一些阅读等,你可以从那里开始。
对于表test_numeric
与x numeric(4,2)
柱:
test=> select atttypmod from pg_attribute where attrelid = 'test_numeric'::regclass AND attname = 'x';
atttypmod
-----------
262150
(1 row)
如果我ALTER
它15,6
:
test=> select atttypmod from pg_attribute where attrelid = 'test_numeric'::regclass AND attname = 'x';
atttypmod
-----------
983050
(1 row)
(我不能打扰阅读的代码上的typmod怎么看32位的typmod字段被分解为精度和尺度,但你可以如果你想要。)
它应安全UPDATE
pg_attribute
条目与新的atttypmod。但正如我所说的,先做一些阅读和研究,看看你能否找到关于直接typmod更新的先前讨论。适用于延长VARCHAR(n)
任何也将适用于NUMERIC
,因为两者都是内部VARLENA
存储类型,并且都typmods其中较大的值较小值的纯超集。你可能会发现更多关于延长VARCHAR
而不重写的信息。
似乎重写只发生在改变精度的情况下。例如当从(8,2)'到(10,2)'时,表是**不被重写。但是从(8,2)到(10,4)'它会被重写。 –
@a_horse_with_no_name好的! –
@a_horse_with_no_name非常感谢!我已经在我的测试中证实了这一点。虽然我认为文档可能需要更清楚一点。这不是我读过的。好吧。 –
- 1. SQL Server - 在不锁定数据的情况下合并大型表格
- 2. 在不复制数据的情况下锁定财产
- 3. 更精确的数字数据类型比双精度?
- 4. 在不知道类型的情况下打印数据?
- 5. 在不知道数据布局的情况下访问json类型数据?
- 6. 小数点精度丢失对于一些双数据类型的情况下的某些munbers
- 7. 是否可以在不指定类型的情况下传递表参数?
- 8. 如何在JSON类型表单数据的情况下检查所需参数
- 9. 如何在不编制更多字段的情况下提高计数性能?
- 10. 在不锁定表的情况下导入MySQL InnoDB转储
- 11. 如何在不定义容器高度的情况下设置高图中字幕的高度?
- 12. 在不知道类型的情况下设置数组值
- 13. Ember.js在不锁定浏览器的情况下渲染大型列表
- 14. 在不更改数据库的情况下更改模型?
- 15. 在不使用数组的情况下查找第二高的数字
- 16. 在不改变视图的情况下提交Grails表格
- 17. SQLite3:如何在不丢失数据的情况下修改fileds的类型
- 18. 如何在不包装数据的情况下在网格中显示数据?
- 19. 如何获得的BigDecimal类型数据的精度在@Entity类
- 20. 界泛型类型的情况下类参数
- 21. session.load()方法如何在不触及数据库的情况下提取数据?
- 22. 在数据溢出的情况下右对齐在表格单元格中显示不正确的数据
- 23. 海拔高度的数据类型
- 24. jquery slideDown()在容器不带固定高度的情况下,动画不稳定
- 25. 在这些情况下为Telerik RadGridView列设置数据类型?
- 26. 在这种情况下应该是什么数据类型?
- 27. Oracle“Number”数据类型精度
- 28. 映射整数类型在特定情况下
- 29. Fopen文件锁定在PHP(读写器类型的情况)
- 30. 在不知道前缀的情况下在数据库中插入表格
什么是原始列定义?当您不更改_precision_时,表格将不会被**重写,例如从'(12,6)'到'(15,6)'不会发生重写。 –