一,修改表
PostgreSQL 提供了一族命令用於修改現有表。
可以實現:
增加字段,
刪除字段,
增加約束,
刪除約束,
修改默認值,
重命名字段,
重命名表。
這些操作可以用:ALTER TABLE命令執行的。
1,增加字段
要增加一個字段,使用這條命令:
ALTER TABLE products ADD COLUMN description text;
新增的字段對於表中已經存在的行而言最初將先填充空值。
你也可以同時在該字段上定義約束,使用通常的語法:
ALTER TABLE products ADD COLUMN description text CHECK (description <> '');
一個新字段不能用非空約束,因為最初的時候該字段必須包含空值。 但是你可以稍后增加一個非空約束。同樣,你也不能在一個新字段 上定義默認值。根據 SQL 標准的說明,這樣需要對現存行的新 字段填充默認值,而這個特性還沒有實現。但是你可以稍后調整 字段預設。
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;
要增加一個不能寫成表約束的非空約束,使用下面語法:
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;
這個約束將立即進行檢查,所以表在加入約束之前必須符合約束條件。
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里是這樣的。
如果刪除一個還沒有定義的默認值不算錯誤,因為預設隱含就是空值。
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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!