当前位置: 首页 > 编程笔记 >

postgresql 修改字段长度的操作

池宸
2023-03-14
本文向大家介绍postgresql 修改字段长度的操作,包括了postgresql 修改字段长度的操作的使用技巧和注意事项,需要的朋友参考一下

使用数据库postgresql的时候,有时会遇到字段长度扩展的情况,由于之前已经有数据了,所以只能修改字段长度,不能通过删除再增加的方式。

可以使用如下方式进行

ALTER TABLE your_table_name alter COLUMN your_column_name type character varying(3000);

通过上面的一句话就可以把你的表中相应的字段的长度修改为3000.

补充:PostgreSQL字符类型长度变更的性能

背景

业务有时会遇到表中的字符型字段的长度不够用的问题,需要修改表定义。但是表里的数据已经很多了,修改字段长度会不会造成应用堵塞呢?

测试验证

做了个小测试,如下

建表并插入1000w数据

postgres=# create table tbx1(id int,c1 char(10),c2 varchar(10));
CREATE TABLE
postgres=# insert into tbx1 select id ,'aaaaa','aaaaa' from generate_series(1,10000000) id;
INSERT 0 10000000 

变更varchar类型长度

postgres=# alter table tbx1 alter COLUMN c2 type varchar(100);
ALTER TABLE
Time: 1.873 ms
postgres=# alter table tbx1 alter COLUMN c2 type varchar(99);
ALTER TABLE
Time: 12815.678 ms
postgres=# alter table tbx1 alter COLUMN c2 type varchar(4);
ERROR: value too long for type character varying(4)
Time: 5.328 ms 

变更char类型长度

postgres=# alter table tbx1 alter COLUMN c1 type char(100);
ALTER TABLE
Time: 35429.282 ms
postgres=# alter table tbx1 alter COLUMN c1 type char(6);
ALTER TABLE
Time: 20004.198 ms
postgres=# alter table tbx1 alter COLUMN c1 type char(4);
ERROR: value too long for type character(4)
Time: 4.671 ms 

变更char类型,varchar和text类型互转

alter table tbx1 alter COLUMN c1 type varchar(6);
ALTER TABLE
Time: 18880.369 ms
postgres=# alter table tbx1 alter COLUMN c1 type text;
ALTER TABLE
Time: 12.691 ms
postgres=# alter table tbx1 alter COLUMN c1 type varchar(20);
ALTER TABLE
Time: 32846.016 ms
postgres=# alter table tbx1 alter COLUMN c1 type char(20);
ALTER TABLE
Time: 39796.784 ms
postgres=# alter table tbx1 alter COLUMN c1 type text;
ALTER TABLE
Time: 32091.025 ms
postgres=# alter table tbx1 alter COLUMN c1 type char(20);
ALTER TABLE
Time: 26031.344 ms 

定义变更后的数据

定义变更后,数据位置未变,即没有产生新的tuple

postgres=# select ctid,id from tbx1 limit 5;
 ctid | id 
-------+----
 (0,1) | 1
 (0,2) | 2
 (0,3) | 3
 (0,4) | 4
 (0,5) | 5
(5 rows) 

除varchar扩容以外的定义变更,每个tuple产生一条WAL记录

$ pg_xlogdump -f -s 3/BE002088 -n 5
rmgr: Heap    len (rec/tot):   3/  181, tx:    1733, lsn: 3/BE002088, prev 3/BE001FB8, desc: INSERT off 38, blkref #0: rel 1663/13269/16823 blk 58358
rmgr: Heap    len (rec/tot):   3/  181, tx:    1733, lsn: 3/BE002140, prev 3/BE002088, desc: INSERT off 39, blkref #0: rel 1663/13269/16823 blk 58358
rmgr: Heap    len (rec/tot):   3/  181, tx:    1733, lsn: 3/BE0021F8, prev 3/BE002140, desc: INSERT off 40, blkref #0: rel 1663/13269/16823 blk 58358
rmgr: Heap    len (rec/tot):   3/  181, tx:    1733, lsn: 3/BE0022B0, prev 3/BE0021F8, desc: INSERT off 41, blkref #0: rel 1663/13269/16823 blk 58358
rmgr: Heap    len (rec/tot):   3/  181, tx:    1733, lsn: 3/BE002368, prev 3/BE0022B0, desc: INSERT off 42, blkref #0: rel 1663/13269/16823 blk 58358 

结论

varchar扩容,varchar转text只需修改元数据,毫秒完成。

其它转换需要的时间和数据量有关,1000w数据10~40秒,但是不改变数据文件,只是做检查。

缩容时如果定义长度不够容纳现有数据报错

不建议使用char类型,除了埋坑几乎没什么用,这一条不仅适用与PG,所有关系数据库应该都适用。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持小牛知识库。如有错误或未考虑完全的地方,望不吝赐教。

 类似资料:
  • 问题内容: 我有一个名为的表,我想对它们进行排序,以表最填写的顺序。每个列都是JSONB列或TEXT列。我并不需要很确定,因此通常我按以下顺序订购: 但是,这很慢,因此我想创建一个索引。但是,这不起作用: 也没有 不能说我很惊讶。声明此索引的正确方法是什么? 问题答案: 要测量文本表示形式中行的大小,您可以将整个行都转换为文本,这比连接单个列要快得多: 但是索引中的此表达式存在3(或4)个问题:

  • 问题内容: 使用postgresql 9.3,我可以选择JSON数据类型的特定字段,但是如何使用UPDATE修改它们呢?我在postgresql文档中或在线上找不到任何示例。我尝试了明显的方法: 问题答案: 更新 :在PostgreSQL 9.5中 ,PostgreSQL本身具有一些操纵功能(但对于;没有;操纵值需要强制转换)。 合并2个(或更多)JSON对象(或串联数组): 因此,可以使用以下命

  • 主要内容:修改字段名称,修改字段数据类型,删除字段在《MySQL数据表添加字段》一节我们介绍了 MySQL 添加数据表字段的 3 种方式,本节主要介绍 MySQL 修改和删除数据表字段的方法。  修改字段名称 MySQL 中修改表字段名的语法规则如下: ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>; 其中: 旧字段名:指修改前的字段名; 新字段名:指修改后的字段名; 新数据类型:指修改后的数据类型,如

  • 操作步骤: ①在"图层管理"模块,选择一个带有数据的图层,点击"数据视图"。 ②弹出数据视图窗口,点击字段名称右侧向下按钮。 ③选择"字段编辑"。 ④弹出字段编辑窗口,选择类型后,点击保存。 提示: ●修改字段名称可以进入修改列标题中查看。 ●数据批量导入的情况下,默认字段类型为文本型(字符串),根据需要和数据内容可以转换为实际类型,目前亿景智图支持以下几种类型: 1)文本类型:支持包括文字、数字

  • 问题内容: 我在SQL数据库中有一个字符串,表示一个URL。有些网址很短,有些很长。我真的不知道这是我可能遇到的最长的URL,所以为了安全起见,我会采用较大的值,例如256或512。 当我定义最大字符串长度时(例如,使用SQLAlchemy): 即使实际的字符串较短,这是否也会占用每一行的空间(存储空间)? 我假设这与实现细节有关。我正在使用postgreSQL,但对sqlite和mysql也很感