PostgreSQL修改數據庫表的列屬性(ALTER語句)

一,修改表
PostgreSQL 提供了一族命令用於修改現有表。 
能夠實現:
增長字段,
刪除字段,
增長約束,
刪除約束,
修改默認值,
重命名字段,
重命名錶。
這些操做能夠用:ALTER TABLE命令執行的。sql

1,增長字段
要增長一個字段,使用這條命令: 
ALTER TABLE products ADD COLUMN description text;
新增的字段對於表中已經存在的行而言最初將先填充空值。 
你也能夠同時在該字段上定義約束,使用一般的語法: 
ALTER TABLE products ADD COLUMN description text CHECK (description <> '');
一個新字段不能用非空約束,由於最初的時候該字段必須包含空值。 可是你能夠稍後增長一個非空約束。一樣,你也不能在一個新字段 上定義默認值。根據 SQL 標準的說明,這樣須要對現存行的新 字段填充默認值,而這個特性尚未實現。可是你能夠稍後調整 字段預設。express

2,刪除字段
除一個字段: 
ALTER TABLE products DROP COLUMN description;函數

3,增長約束
要增長一個約束,使用表約束語法。好比: 
 代碼示例:
ALTER TABLE products ADD CHECK (name <> '');
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;spa

要增長一個不能寫成表約束的非空約束,使用下面語法: 
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;.net

這個約束將當即進行檢查,因此表在加入約束以前必須符合約束條件。code

4,刪除約束
要刪除一個約束,你須要知道它的名字。若是你給了它一個名字, 那麼事情就好辦了。
不然系統會分配一個生成的名字,這樣你就須要 把它找出來了。psql 的命令 \d tablename 在這兒能夠幫忙﹔ 
其它接口可能也提供了檢查表的細節的方法。
命令: 
ALTER TABLE products DROP CONSTRAINT some_name;
除了非空約束外,全部約束類型都這麼用。要刪除非空類型,用 
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
(要記得非空約束沒有名字。)對象

5,改變默認值
要給一個字段設定默認值,使用一個象下面這樣的命令: 
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
要刪除默認值,用 
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
這樣至關於把預設設定爲空,至少在 PostgreSQL裏是這樣的。 
若是刪除一個尚未定義的默認值不算錯誤,由於預設隱含就是空值。blog

6,給字段更名字
重命名一個字段: 
ALTER TABLE products RENAME COLUMN product_no TO product_number;繼承

7,給表更名字
 代碼示例:
To rename a table: 
ALTER TABLE products RENAME TO items;遞歸


Name
ALTER TABLE -- 修改表的定義
Synopsis

ALTER TABLE [ ONLY ] name [ * ]
action [, ... ]
ALTER TABLE [ ONLY ] name [ * ]
RENAME [ COLUMN ] column TO new_column
ALTER TABLE name
RENAME TO new_name
ALTER TABLE name
SET SCHEMA new_schema

這裏 action 是下列之一:

ADD [ COLUMN ] column type [ column_constraint [ ... ] ]
DROP [ COLUMN ] column [ RESTRICT | CASCADE ]
ALTER [ COLUMN ] column TYPE type [ USING expression ]
ALTER [ COLUMN ] column SET DEFAULT expression
ALTER [ COLUMN ] column DROP DEFAULT
ALTER [ COLUMN ] column { SET | DROP } NOT NULL
ALTER [ COLUMN ] column SET STATISTICS integer
ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
ADD table_constraint
DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
DISABLE TRIGGER [ trigger_name | ALL | USER ]
ENABLE TRIGGER [ trigger_name | ALL | USER ]
CLUSTER ON index_name
SET WITHOUT CLUSTER
SET WITHOUT OIDS
OWNER TO new_owner
SET TABLESPACE new_tablespace
描述
ALTER TABLE 變動一個現存表的定義。它有好幾種子形式:

ADD COLUMN
這種形式用和 CREATE TABLE 裏同樣的語法向表中增長一個新的字段。

DROP COLUMN
這種形式從表中刪除一個字段。請注意,和這個字段相關的索引和表約束也會被自動刪除。 若是任何表以外的對象依賴於這個字段, 你必須說CASCADE,好比,外鍵參考,視圖等等。

ALTER COLUMN TYPE
這種類型改變表中一個字段的類型。該字段涉及的索引和簡單的表約束將被自動地轉換爲使用新的字段類型, 方法是從新分析最初提供的表達式。可選的 USING 子句聲明如何從舊的字段值裏計算新的字段值; 若是省略,那麼缺省的轉換就是從舊類型像新類型的賦值轉換。若是從舊數據類型到新類型沒有隱含或者賦值的轉換, 那麼必須提供一個 USING。

SET/DROP DEFAULT
這種形式爲一個字段設置或者刪除缺省值。請注意缺省值只應用於隨後的 INSERT 命令; 它們不會致使已經在表中的行的數值的修改。咱們也能夠爲視圖建立缺省, 這個時候它們是在視圖的 ON INSERT 規則應用以前插入 INSERT 語句中去的。

SET/DROP NOT NULL
這些形式修改一個字段是否標記爲容許 NULL 值或者是拒絕 NULL 值。 若是表在字段中包含非空值,那麼你只能夠 SET NOT NULL。

SET STATISTICS
這個形式爲隨後的 ANALYZE 操做設置每字段的統計收集目標(default_statistics_target)。 目標的範圍能夠在 0 到 1000 以內設置;另外,把他設置爲 -1 則表示從新恢復到使用系統缺省的統計目標。 有關 PostgreSQL 查詢規劃器使用的統計信息的更多信息, 請參考Section 13.2。

SET STORAGE
這種形式爲一個字段設置存儲模式。這個設置控制這個字段是內聯保存仍是保存在一個附屬的表裏,以及數據是否要壓縮。 PLAIN 必需用於定長的數值,好比 integer,而且是內聯的,不壓縮的。 MAIN 用於內聯,可壓縮的數據。 EXTERNAL 用於外部保存,不壓縮的數據, 而 EXTENDED 用於外部的壓縮數據。 EXTENDED 是大多數支持非 PLAIN 存儲的數據之缺省。 使用 EXTERNAL 將令在 text 字段上的子字串操做更快, 付出的代價是增長了存儲空間。 請注意 SET STORAGE 自己並不改變表上的任何東西, 只是設置未來的表操做時,建議使用的策略。參閱 Section 50.2 獲取更多信息。

ADD table_constraint
這個形式給表增長一個新的約束,用的語法和 CREATE TABLE 同樣。

DROP CONSTRAINT
這個形式刪除一個表上的約束。 目前,在表上的約束不要求有惟一的名字,所以可能有多個約束匹配聲明的名字。 全部這樣的約束都將被刪除。

DISABLE/ENABLE TRIGGER
這個形式關閉或者打開屬於該表的觸發器。 一個被關閉掉的觸發器是系統仍然知道的,可是在觸發器事件發生的時候不會被執行。 對於一個推遲了的觸發器,在事件發生的時候會檢查打開狀態,而不是在函數實際執行的時候。 咱們能夠經過申明名字的方法打開或者關閉任意一個觸發器, 或者是該表上的全部觸發器,或者只是用戶觸發器(這個選項排除了那些用於實現外鍵約束的觸發器)。 打開或者關閉約束觸發器要求超級用戶權限; 這麼作的時候應該當心,由於若是觸發器不執行的話,約束保證的數據完整性也就沒有辦法確保了。

CLUSTER
這種形式爲未來的 CLUSTER 選項選擇缺省索引。它實際上並不從新對錶建簇。

SET WITHOUT CLUSTER
這種形式從表中刪除最新使用的 CLUSTER 索引。 這樣會影響未來那些沒有聲明索引的建簇操做。

SET WITHOUT OIDS
這種形式從表中刪除 oid 系統字段。 它和 DROP COLUMN oid RESTRICT 徹底相同, 只不過是若是表上已經沒有 oid 字段了,那麼它不會報告錯誤。

請注意,不存在某種 ALTER TABLE 的變種能夠在刪除了 OID 以後再把它們恢復回來。

RENAME
RENAME 形式改變一個表的名字(或者是一個索引,一個序列,或者一個視圖)或者是表中一個獨立字段的名字。 它對存儲的數據沒有任何影響。

OWNER
這個形式改變表,序列或者視圖的全部者爲指定全部者。

SET TABLESPACE
這種形式把表的表空間修改成指定的表空間而且把與表相關的數據文件移動到新的表空間去。 若是在表上呦索引,則不會移動。可是他們能夠經過額外的 SET TABLESPACE 命令移動。參閱 CREATE TABLESPACE。

RENAME
RENAME 形式改變一個表(或者一個索引,序列,或者視圖)的名字, 或者是表中獨立字段的名字。它們對存儲的數據沒有影響。

SET SCHEMA
這種形式把表移動到另一個模式。相關的索引,約束,以及 SERIAL 字段的序列都跟着移動。

 

除了 RENAME 和 SET SCHEMA 以外全部動做均可以捆綁再一個屢次修改的列表中同時施用。 好比,咱們能夠在一個命令裏增長几個字段和/或修改幾個字段的類型。 對於大表,這麼作特別有用,由於只須要對該表作一次處理。

要使用 ALTER TABLE,你必需擁有該表。 要修改一個表的模式,你必須在新的模式上有 CREATE 權限。要修改全部者,你必須仍是新的全部角色的直接或者間接的成員, 而且該角色在該表的模式上必須擁有 CREATE 權限。 (這樣的限制就保證了修改全部者這個動做和刪除、重建該表能作到的動做沒有什麼區別。 不過,超級用戶能夠修改任何表的全部者。)

參數
table
試圖更改的現存表(可能有模式修飾)的名稱。 若是聲明瞭 ONLY,則只更改該表。 若是沒有聲明 ONLY,則該表及其全部後表明(若是有)都被更新。 咱們能夠在表名字後面附加一個 * 表示後表明都被掃描,可是在目前的版本里,這是缺省行爲。 (在7.1以前的版本,ONLY 是缺省的行爲。)缺省能夠經過改變配置選項 sql_inheritance 來改變。

column
現存或新的字段名稱。

new_column
現存字段的新名稱。

new_name
表的新名稱。

type
新字段的類型,或者現存字段的新類型。

table_constraint
表的新的約束定義。

constraint_name
要刪除的現有約束的名字。

trigger_name
要打開或者關閉的單個觸發器的名字。

ALL
打開或者關閉屬於該表的全部觸發器。 (若是這些觸發器中有外鍵約束,那麼就要求超級用戶權限。)

USER
打開或者關閉全部屬於該表的非外鍵約束觸發器。

index_name
要標記爲建簇的表上面的索引名字。

CASCADE
自動刪除依賴於被依賴字段或者約束的對象(好比,引用該字段的視圖)。

RESTRICT
若是字段或者約束還有任何依賴的對象,則拒絕刪除該字段。 這是缺省行爲。

new_owner
該表的新全部者的用戶名。

new_tablespace
這個表將要移動往的表空間名字。

new_schema
表將移動前往的模式的名字。

注意
COLUMN 關鍵字是多餘的,能夠省略。

若是用 ADD COLUMN 增長一個字段,那麼全部表中現有行都初始化爲該字段的缺省值 (若是沒有聲明 DEFAULT 子句,那麼就是 NULL)。

用一個非空缺省增長一個字段或者是改變一個字段的現有類型會要求整個表的重寫。 對於大表來講,這個操做可能會花很長時間;而且它還臨時須要兩倍的磁盤空間。

增長一個 CHECK 或者 NOT NULL 約束要求掃描該表以保證現有的行復合約束要求。

提供在一個 ALTER TABLE 裏面聲明多個修改的主要緣由是原先須要的對錶的屢次掃描和重寫能夠組合成一個回合。

DROP COLUMN 命令並非物理上把字段刪除, 而只是簡單地把它標記爲 SQL 操做中不可見的。隨後對該表的插入和更新將在該字段存儲一個 NULL。 所以,刪除一個字段是很快的,可是它不會當即縮減你的表在磁盤上的大小,由於被刪除了的字段佔據的空間尚未回收。 這些空間將隨着現有的行的更新而獲得回收。

ALTER TYPE 要求重寫整個表的特性有時候是一個優勢, 由於重寫的過程消除了任何表中的沒用的空間。好比,要想馬上回收被一個已經刪除的字段佔據的空間, 最快的方法是

ALTER TABLE table ALTER COLUMN anycol TYPE anytype;
這裏 anycol 是任何在表中還存在的字段,而 anytype 是和該字段的原類型同樣的類型。 這樣的結果是在表上沒有任何可見的語意的變化,可是這個命令強迫重寫,這樣就刪除了再也不使用的數據。

ALTER TYPE 的 USING 選項實際上能夠聲明涉及該行舊值的任何表達式; 也就是說,它能夠引用除了正在被轉換的字段以外其它的字段。這樣,咱們就能夠用 ALTER TYPE 語法作很是廣泛性的轉換。由於這個靈活性,USING 表達式並無施用於該字段的缺省值(若是有的話); 結果可能不是缺省表達式要求的常量表達式。 這就意味着若是從舊類型到新類型若是沒有隱含或者賦值轉換的話, 那麼即便存在 USING 子句的狀況下, ALTER TYPE 也可能沒法把缺省值轉換成新的類型。 在這種狀況下,咱們應該用 DROP DEFAULT 先刪除缺省, 執行 ALTER TYPE,而後使用 SET DEFAULT 增長一個合適的新缺省。 相似的考慮也適用於涉及該字段的索引和約束。

若是表有任何後表明,那麼若是不在後表明上作一樣的修改的話, 就不容許在父表上增長,重命名或者修改一個字段的類型,也就是說, ALTER TABLE ONLY將被拒絕。這樣就保證了後表明老是有和父表匹配的字段。

一個遞歸DROP COLUMN 操做將只有在後表明並不從任何其它父表中繼承該字段而且歷來沒有獨立定義該字段的時候才能刪除一個後表明的字段。 一個非遞歸的DROP COLUMN(也就是,ALTER TABLE ONLY ... DROP COLUMN)歷來不會刪除任何後代字段, 而是把他們標記爲獨立定義的,而不是繼承的。

TRIGGER,CLUSTER,OWNER,和 TABLESPACE 行爲毫不會遞歸到後表明; 也就是說,它們的行爲就像老是聲明瞭 ONLY 同樣。 添加一個約束只能在CHECK 約束上遞歸。

不容許更改系統表結構的任何部分。

請參考 CREATE TABLE 部分獲取更多有效參數的描述。 Chapter 5 裏有更多有關繼承的信息。

例子
向表中增長一個 varchar 列:

ALTER TABLE distributors ADD COLUMN address varchar(30);
 

從表中刪除一個字段:

ALTER TABLE distributors DROP COLUMN address RESTRICT;
 

在一個操做中修改兩個現有字段的類型:

ALTER TABLE distributors
ALTER COLUMN address TYPE varchar(80),
ALTER COLUMN name TYPE varchar(100);
 

使用一個 USING 子句, 把一個包含 UNIX 時間戳的 integer 字段轉化成 timestamp with time zone:

ALTER TABLE foo
ALTER COLUMN foo_timestamp TYPE timestamp with time zone
USING
timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';
 

對現存字段更名:

ALTER TABLE distributors RENAME COLUMN address TO city;
 

更改現存表的名字∶

ALTER TABLE distributors RENAME TO suppliers;
 

給一個字段增長一個非空約束:

ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;
從一個字段裏刪除一個非空約束:

ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;
 

給一個表增長一個檢查約束:

ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
 

刪除一個表和它的全部子表的監查約束:

ALTER TABLE distributors DROP CONSTRAINT zipchk;
 

向表中增長一個外鍵約束:

ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses(address) MATCH FULL;
 

給表增長一個(多字段)惟一約束:

ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);
 

給一個表增長一個自動命名的主鍵約束,要注意的是一個表只能有一個主鍵:

ALTER TABLE distributors ADD PRIMARY KEY (dist_id);
 

把表移動到另一個表空間:

ALTER TABLE distributors SET TABLESPACE fasttablespace;
 

把表移動到另一個模式:

ALTER TABLE myschema.distributors SET SCHEMA yourschema;
 

兼容性
ADD,DROP,和 SET DEFAULT 形式與 SQL 標準兼容。 其它形式是 PostgreSQL 對 SQL 標準的擴展。 還有,在一個 ALTER TABLE 命令裏聲明多於一個操做也是擴展。

ALTER TABLE DROP COLUMN 能夠用於刪除表中的惟一的一個字段, 留下一個零字段的表。這是對 SQL 的擴展,它不容許零字段表。--------------------- 做者:killer-leon 來源:CSDN 原文:https://blog.csdn.net/u011627980/article/details/51352559 版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索