濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > postgresql 修改字段長(zhǎng)度的操作

postgresql 修改字段長(zhǎng)度的操作

熱門(mén)標(biāo)簽:美容工作室地圖標(biāo)注 打電話智能電銷(xiāo)機(jī)器人授權(quán) 海豐有多少商家沒(méi)有地圖標(biāo)注 辦公外呼電話系統(tǒng) 漯河外呼電話系統(tǒng) 合肥公司外呼系統(tǒng)運(yùn)營(yíng)商 重慶自動(dòng)外呼系統(tǒng)定制 地圖標(biāo)注和圖片名稱(chēng)的區(qū)別 外呼調(diào)研系統(tǒng)

使用數(shù)據(jù)庫(kù)postgresql的時(shí)候,有時(shí)會(huì)遇到字段長(zhǎng)度擴(kuò)展的情況,由于之前已經(jīng)有數(shù)據(jù)了,所以只能修改字段長(zhǎng)度,不能通過(guò)刪除再增加的方式。

可以使用如下方式進(jìn)行

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

通過(guò)上面的一句話就可以把你的表中相應(yīng)的字段的長(zhǎng)度修改為3000.

補(bǔ)充:PostgreSQL字符類(lèi)型長(zhǎng)度變更的性能

背景

業(yè)務(wù)有時(shí)會(huì)遇到表中的字符型字段的長(zhǎng)度不夠用的問(wèn)題,需要修改表定義。但是表里的數(shù)據(jù)已經(jīng)很多了,修改字段長(zhǎng)度會(huì)不會(huì)造成應(yīng)用堵塞呢?

測(cè)試驗(yàn)證

做了個(gè)小測(cè)試,如下

建表并插入1000w數(shù)據(jù)

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類(lèi)型長(zhǎng)度

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 

變更c(diǎn)har類(lèi)型長(zhǎng)度

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 

變更c(diǎn)har類(lèi)型,varchar和text類(lèi)型互轉(zhuǎn)

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 

定義變更后的數(shù)據(jù)

定義變更后,數(shù)據(jù)位置未變,即沒(méi)有產(chǎn)生新的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擴(kuò)容以外的定義變更,每個(gè)tuple產(chǎn)生一條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 

結(jié)論

varchar擴(kuò)容,varchar轉(zhuǎn)text只需修改元數(shù)據(jù),毫秒完成。

其它轉(zhuǎn)換需要的時(shí)間和數(shù)據(jù)量有關(guān),1000w數(shù)據(jù)10~40秒,但是不改變數(shù)據(jù)文件,只是做檢查。

縮容時(shí)如果定義長(zhǎng)度不夠容納現(xiàn)有數(shù)據(jù)報(bào)錯(cuò)

不建議使用char類(lèi)型,除了埋坑幾乎沒(méi)什么用,這一條不僅適用與PG,所有關(guān)系數(shù)據(jù)庫(kù)應(yīng)該都適用。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • postgresql varchar字段regexp_replace正則替換操作
  • 解決postgresql表中的字段名稱(chēng)包含特殊符號(hào)的問(wèn)題
  • PostgreSQL 實(shí)現(xiàn)查詢表字段信息SQL腳本
  • PostgreSQL 更新JSON,JSONB字段的操作
  • postgresql 實(shí)現(xiàn)獲取所有表名,字段名,字段類(lèi)型,注釋
  • postgresql 補(bǔ)齊空值、自定義查詢字段并賦值操作

標(biāo)簽:衡陽(yáng) 來(lái)賓 烏海 株洲 蚌埠 晉城 錦州 珠海

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《postgresql 修改字段長(zhǎng)度的操作》,本文關(guān)鍵詞  postgresql,修改,字段,長(zhǎng)度,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《postgresql 修改字段長(zhǎng)度的操作》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于postgresql 修改字段長(zhǎng)度的操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    吉首市| 丹阳市| 庄浪县| 瑞昌市| 万山特区| 哈密市| 万宁市| 册亨县| 宣恩县| 郧西县| 新平| 应城市| 湘潭县| 宕昌县| 前郭尔| 东明县| 吉首市| 靖边县| 兰考县| 新乐市| 黔西县| 芮城县| 泽州县| 罗定市| 毕节市| 凤凰县| 新绛县| 澎湖县| 前郭尔| 大同县| 台南县| 望都县| 河南省| 华安县| 鹿邑县| 会理县| 红安县| 金华市| 汝南县| 新龙县| 靖边县|