国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PG修改字段

IT那活兒 / 3675人閱讀
PG修改字段

今天又遇到一個(gè)需求,要把PG中的字段類(lèi)型修改一下。本來(lái)以為是個(gè)很簡(jiǎn)單的事情,畢竟Oracle就是一條指令就行了。但是在PG中改字段真的真的太難了。



當(dāng)你修改表字段的時(shí)候,會(huì)報(bào)ERROR: cannot alter type of a column used by a view or rule.


這主要是因?yàn)檫@個(gè)表上存在視圖或者是rule,rule這里代表是觸發(fā)器。所以在PG中它不能像Oracle那樣修改字段。一般做法就是:

BEGIN;

DROP VIEW view_name

ALTER TABLE users ALTER COLUMN column_name TYPE character varying(500);

CREATE VIEW view_name AS SELECT * FROM table_name;

COMMIT;


這樣干也沒(méi)什么問(wèn)題,但是一旦上百個(gè)視圖依賴于一張表,或者視圖有多個(gè)嵌套,這問(wèn)題就麻煩起來(lái)了,特別是有的視圖定義動(dòng)輒上百上千行的,修改字段再創(chuàng)建視圖,一套弄下來(lái)就特別累。那么就沒(méi)有什么完美的解決辦法嗎?


通過(guò)研究,發(fā)現(xiàn)這個(gè)問(wèn)題有兩種解決辦法,針對(duì)兩種不同的情況。


情況一:只修改長(zhǎng)度

修改長(zhǎng)度,是在日常維護(hù)中經(jīng)常發(fā)生的。比如以前一個(gè)字段是20個(gè)長(zhǎng)度,運(yùn)行一段時(shí)間之后,發(fā)現(xiàn)長(zhǎng)度不夠要擴(kuò)成30。這個(gè)時(shí)候一般就會(huì)通知dba進(jìn)行操作。我們可以通過(guò)修改pg_attribute基表的方式來(lái)繞開(kāi)這個(gè)限制。

create table a(id int ,name varchar(20));

create view a_view as select id,name from a;


alter table a alter name type varchar(30);

ERROR: cannot alter type of a column used by a view or rule

DETAIL: rule _RETURN on view a_view depends on column "name"


SELECT atttypmod FROM pg_attribute WHERE attrelid = a::regclass AND attname = name;

atttypmod

-----------

24

(1 row)


update pg_attribute set atttypmod =34 WHERE attrelid =a::regclass AND attname = name;

UPDATE 1


SELECT atttypmod FROM pg_attribute WHERE attrelid = a::regclass AND attname = name;

atttypmod

-----------

34


這里需要注意的一點(diǎn)是我設(shè)置的是varchar(20),查出來(lái)的是varchar(24),這是因?yàn)闅v史原因,添加了4。我如果要改成30,這里就需要修改為34。


改完之后我們?cè)賮?lái)查詢我們的表和視圖,發(fā)現(xiàn)都是ok的。

postgres=# d a

Table "public.a"

Column |         Type          | Collation | Nullable | Default

--------+-----------------------+-----------+----------+---------

id    | integer               |           |          |

name  | character varying(30) |           |          |


postgres=# insert into a values(1,aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);

INSERT 0 1

postgres=# select lengthb(name) from a;

lengthb

---------

29


postgres=# select * from a_view;

id |             name              

----+-------------------------------

1 | aaaaaaaaaaaaaaaaaaaaaaaaaaaaa


雖然這樣修改能解決問(wèn)題,但是確實(shí)有一定發(fā)生錯(cuò)誤的風(fēng)險(xiǎn),所以需要謹(jǐn)慎使用,最好要經(jīng)過(guò)詳細(xì)的評(píng)審和測(cè)試之后再操作。


情況二:修改字段類(lèi)型

修改字段類(lèi)型這種情況多見(jiàn)于執(zhí)行SQL緩慢,通過(guò)執(zhí)行計(jì)劃發(fā)現(xiàn)是字段類(lèi)型不匹配產(chǎn)生了隱式在轉(zhuǎn)換,而無(wú)法使用上索引。


這種情況就得通過(guò)我們之前的方法來(lái)實(shí)現(xiàn),把刪除視圖、修改字段、創(chuàng)建視圖放到一個(gè)事務(wù)下執(zhí)行,但是如果嵌套的視圖比較多就很麻煩。為了克服這個(gè)麻煩,就有一個(gè)大神級(jí)人物寫(xiě)了兩個(gè)函數(shù)來(lái)輕松實(shí)現(xiàn)了這個(gè)問(wèn)題。由于太多人受到這個(gè)“煩惱”問(wèn)題的困擾,作者得到了極高的贊揚(yáng)。

BEGIN;

select deps_save_and_drop_dependencies(public, a);

alter table a alter name type varchar(30);

select deps_restore_dependencies(public, a);

COMMIT

以下是我在自己環(huán)境中進(jìn)行的測(cè)試,非常簡(jiǎn)單就搞定了。


函數(shù)可以在github上下載:

https://gist.github.com/mateuszwenus/11187288(PG12之前版本)

https://gist.github.com/briandignan/03ef42e78434658cf27f052e2f0798e8(PG12之后的版本)


如果讓我推薦,我還是推薦使用第二種方法,畢竟這個(gè)方法比較穩(wěn)妥一點(diǎn)。也基本上達(dá)到了比較完美的地步。就算遇到上百個(gè)視圖或者像俄羅斯套娃一樣的視圖你也不用擔(dān)心了。

參考文檔:

Problemwith Postgres ALTER TABLE

https://stackoverflow.com/questions/3243863/problem-with-postgres-alter-table/49000321

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/130086.html

相關(guān)文章

  • PostgreSQL對(duì)接SequoiaDB

    摘要:是一款開(kāi)源的數(shù)據(jù)庫(kù),支持標(biāo)準(zhǔn),用戶可以通過(guò)驅(qū)動(dòng)連接進(jìn)行應(yīng)用程序開(kāi)發(fā)。本文就針對(duì)如何擴(kuò)展功能,實(shí)現(xiàn)對(duì)接進(jìn)行介紹。直接在中修改配置文件,只能在當(dāng)前中生效,重新登錄需要重新設(shè)置。 PostgreSQL是一款開(kāi)源的SQL數(shù)據(jù)庫(kù),支持標(biāo)準(zhǔn)SQL,用戶可以通過(guò)JDBC驅(qū)動(dòng)連接PostgreSQL進(jìn)行應(yīng)用程序開(kāi)發(fā)。用戶通過(guò)擴(kuò)展PostgreSQL功能,讓開(kāi)發(fā)者可以使用SQL語(yǔ)句訪問(wèn)SequoiaDB...

    TZLLOG 評(píng)論0 收藏0
  • PostgreSQL查詢表以及字段備注

    摘要:查詢所有表名稱以及字段含義表名名稱字段字段備注列類(lèi)型查看所有表名查看表名和備注查看特定表名備注查看特定表名字段 查詢所有表名稱以及字段含義 select c.relname 表名,cast(obj_description(relfilenode,pg_class) as varchar) 名稱,a.attname 字段,d.description 字段備注,concat_ws(,t.t...

    anonymoussf 評(píng)論0 收藏0
  • 移動(dòng)易開(kāi)源APP組合套件更新——支持多種外部數(shù)據(jù)庫(kù),支持全文搜索

    摘要:移動(dòng)易后臺(tái)實(shí)現(xiàn)外部數(shù)據(jù)庫(kù)連接要實(shí)現(xiàn)外置數(shù)據(jù)庫(kù),即上層開(kāi)發(fā)人員不關(guān)心下層數(shù)據(jù)庫(kù)的實(shí)現(xiàn),在項(xiàng)目中需要針對(duì)不同數(shù)據(jù)庫(kù)修改文件以及在項(xiàng)目中添加依賴包。本文主要介紹移動(dòng)易后臺(tái)如何實(shí)現(xiàn)同不同數(shù)據(jù)源的連接,數(shù)據(jù)源包括,。 1、移動(dòng)易后臺(tái)實(shí)現(xiàn)外部數(shù)據(jù)庫(kù)連接 要實(shí)現(xiàn)外置數(shù)據(jù)庫(kù),即上層開(kāi)發(fā)人員不關(guān)心下層數(shù)據(jù)庫(kù)的實(shí)現(xiàn),在Spring boot項(xiàng)目 中需要針對(duì)不同數(shù)據(jù)庫(kù)修改application.proper...

    anyway 評(píng)論0 收藏0
  • PostgreSQL的實(shí)踐一:初識(shí)

    摘要:每個(gè)服務(wù)由多個(gè)進(jìn)程組成,為首的進(jìn)程名為。服務(wù)使用字節(jié)長(zhǎng)的內(nèi)部事務(wù)標(biāo)識(shí)符,即時(shí)發(fā)生重疊后仍然繼續(xù)使用,這會(huì)導(dǎo)致問(wèn)題,所以需要定期進(jìn)行操作。操作被認(rèn)為是緊跟操作后的操作。在涉及高比例插入刪除的表中,會(huì)造成索引膨脹,這時(shí)候可以重建索引。 簡(jiǎn)介和認(rèn)知 發(fā)音 post-gres-q-l 服務(wù)(server) 一個(gè)操作系統(tǒng)中可以啟動(dòng)多個(gè)postgres服務(wù)。每個(gè)服務(wù)由多個(gè)進(jìn)程組成,為首的進(jìn)程名為p...

    yibinnn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<