PostgreSQL 在9.2 之前是要面临一个指责,就是在更改字段类型的时候带来的不堪,假象你有100万行的数据,其中一个字段是varchar(20) ,你想将其更改为 varhcar(30), 这可能就要造成一个灾难,熟悉postgresql 原理的人们,马上就想到,可能要生成一个“新表”了。导致Postgres重写表的每一行,这可能是一个非常昂贵的操作(就磁盘I/O和挂钟时间而言),MYSQL 早期的版本也没有好到哪里去,可是这对难兄难弟,都会成长。

PostgreSQL 在9.2 之后修改字段的大小,例如 varchar(20) ---> varchar(30) 返回修改仅仅是一瞬间的事情。

所以现在如果还有人说,PG修改字段的大小太差劲,那我到是觉得活在上世纪的 someone 可以清理一下内存了,终归新的东西是要不断学习的,你去看看现在的MYSQL 8 如果你的知识还保留在 MYSQL 5.5 ,那你一定也需要更新了。

那问题1 如果你还在使用PG 9.2 之前的版本,并继续受到这个问题的缠绕,怎么办

1 升级数据库版本 (当然这个说法估计支持的声音不少,但实际上做的人不多,因为牵扯的资源和人太多,没有人愿意在没有占有这个数据库系统的开发或者第三方开发商的支持下去做这个事情)

2 建议将字段更换为text字段,(或者经常需要变动的文字的字段),

ALTER TABLE test ALTER COLUMN puzzle TYPE text;ALTER TABLE test ADD CONSTRAINT checksum_lengthCHECK (LENGTH(puzzle) <= 32);我们先看看这个方法合适吗,这个方法当然合适,字段的扩充可以换个思路,我们可以给的无限,然后后面通过约束限制一下,这样DBA 和开发其实都开心

当然也有人说,你加完约束,系统的性能会受到影响,来来来我们做一个测试,插入1百万的数据,仅仅需要6秒多.

当然这并不是本期主要的话题,本期的主要话题是

这里要澄清的是,不是所有的PG 的 Alter Column type 操作都要进行重建表的操作(这里先不牵扯索引的事情)

这就是今天要进行测试的表,PG的版本 PG 12.2

测试如下

1 name 的类型从 char 变为 varchar 在变成 text

2 将上面的变化在变回来

将整形从小变大 从大变小,将日期类型进行变化

这些都是需要重写的

说完这些可能还有些人有疑问

1 添加一个字段呢,添加一个带默认值的字段呢

2 删除一个字段呢

3 更改一个字段的名字呢

结果是这些都不需要重写,另外在PG11 已经解决了关于 默认值的问题,这个问题,其实在有的商业数据库到很新的版本还是一个问题。

最后是关于索引的问题,这里PG 建立索引尽量要使用

CREATE INDEX CONCURRENTLY idx_add_c on type_change (add_c);

根据PG 的原理来说,我们在建立索引如果不使用 concurrently 参数则建立索引时表要 获取一个 access exclusive 的锁,而如果我们使用了 concurrently 则我们会获得一个 share update exclusive 的锁。所以使用了concurrently 则会允许在索引建立的同时继续读取数据和写入数据,当然也有一些副作用,今天就不说了,这个 concurrently 其实也可以找一期说一下,也是有点意思。

修改字段类型_PostgreSQL 关于字段类型的修改 谣言与止谣相关推荐

  1. C# 禁止修改已装箱了的值类型的字段值,但是可以通过接口的方式实现

    C# 默认是不能修改已装箱了的值类型中字段的值,但是可以通过 值类型实现指定的接口来改变 首先定义一个接口 1 interface IChange 2 { 3 void Change(int a, i ...

  2. mysql增加字段类型_mysql 增加修改字段类型及删除字段类型

    MySQL添加字段: alter table `user_movement_log` Add column GatewayId int not null default 0 AFTER `Region ...

  3. Mysql修改字段名、修改字段类型、删除字段

    目录 1.修改字段类型.字段名.字段注释.类型长度.字段默认值 2.修改表名 3.修改表的注释 4.在指定位置插入新字段 5.删除字段 1. 修改字段类型.字段名.字段注释.类型长度.字段默认值 my ...

  4. oracle更改字段类型 有数据无数据的时候,修改字段长度,增加字段

    有一个表名为tb,字段段名为request_id,数据类型int 更改为VARCHAR2(64). 1.假设字段数据为空,则不管改为什么字段类型,可以直接执行: alter table tb modi ...

  5. postgresql存图片字段类型_PostgreSQL让人着迷的多态性,另辟蹊径省时又省力

    PostgreSQL 让人着迷的地方,不在于他比某些数据库的流行,也不在于比某些数据库的高"贵", 更不如某些数据库的"简单".Postgresql 让人无法自 ...

  6. 使用接口更改已装箱的值类型中的字段

    先看下面一段代码 namespace 使用接口更改已装箱值类型的字段 { //point是一个值类型internal struct Point{private Int32 m_x, m_y;publi ...

  7. 使用MyBatis Plus 3.2.0版本插件代码生成器生成实体类后,对于数据库中字段类型datetime的字段会转变为LocalDateTime类型

    问题描述: 使用MyBatis Plus 3.2.0版本插件代码生成器生成实体类后,对于数据库中字段类型datetime的字段会转变为LocalDateTime类型,IDEA提示报错"Usa ...

  8. SAP S4 MM配置详解之三:物料主数据-定义物料类型/物料状态/字段选择控制/物料组

    1.定义物料类型 概念及功能说明 物料类型是对物料进行分组的一种方式,每一种类型的物料有相同的基本属性,例如原材料.半成品和成品.创建物料主记录时,将物料分配到物料类型.物料类型属于物料的一般数据.控 ...

  9. oracle将其他字段类型改为clob类型方法

    oracle将其他字段类型改为clob类型方法 FIELD_INSTANCE 表名 FIELD_STRING_VALUE 字段名 第一步:添加一个clob类型的字段 alter table FIELD ...

最新文章

  1. Python 无法安装PyAudio问题
  2. cdt仿真程序,可模拟RTU使用CDT92协议和主站端通讯
  3. CI框架表单提交数据接收乱码
  4. 加密和解密.net配置节
  5. 支持向量机—核函数源码分析(2)
  6. 如何使用Android Studio把自己的Android library分享到jCenter和Maven Central
  7. 2021农村电商发展趋势报告
  8. Spring Boot 中使用MyBatis Mapper方式(xml)
  9. 如何共享计算机磁盘,扩展群集共享磁盘的分区 - Windows Server | Microsoft Docs
  10. 数据科学包9-pandas高级内容之数据IO
  11. 小布语音下载安装_一加语音助手小布体验:还有很长的路要走
  12. 三菱fx2n64mr说明书_FX2N-64MR-001手册三菱FX2N-64MR-001使用说明书 - 广州凌控
  13. PHP上传Excel文件
  14. THREEJS相关3d-force-graph 3d力导图使用
  15. 《计算机网络(第七版)谢希仁 编著》第一章内容总结及部分解题
  16. android之WebView应用
  17. 如何抢走亚马逊竞品手上的客户和流量?
  18. 生成流水号如 LS0000001
  19. 高效学习-端正学习态度
  20. Simpsons’ Hidden Talents【KMP模板题】

热门文章

  1. rabbitmq 安装 linux
  2. [BZOJ 4025] 二分图
  3. javascript 之作用域-06
  4. 关于a标签不能调用js方法的小细节,你注意到了么?
  5. vue.js 四(指令和自定义指令)
  6. iOS: 属性声明strong和retain竟然不一样
  7. 浅谈“三层结构”原理与用意(转帖)
  8. 关于如何在BCB中使用CodeGuard
  9. 单例模式(Java)
  10. STM32f103——ILI9341