<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # ALTER TABLE ## Name ALTER TABLE?--?修改表的定義 ## Synopsis ``` ALTER TABLE [ IF EXISTS ] [ ONLY ] _name_ [ * ] _action_ [, ... ] ALTER TABLE [ IF EXISTS ] [ ONLY ] _name_ [ * ] RENAME [ COLUMN ] _column_name_ TO _new_column_name_ ALTER TABLE [ IF EXISTS ] [ ONLY ] _name_ [ * ] RENAME CONSTRAINT _constraint_name_ TO _new_constraint_name_ ALTER TABLE [ IF EXISTS ] _name_ RENAME TO _new_name_ ALTER TABLE [ IF EXISTS ] _name_ SET SCHEMA _new_schema_ 其中`_action_` 可以是以選項之一: ADD [ COLUMN ] _column_name_ _data_type_ [ COLLATE _collation_ ] [ _column_constraint_ [ ... ] ] DROP [ COLUMN ] [ IF EXISTS ] _column_name_ [ RESTRICT | CASCADE ] ALTER [ COLUMN ] _column_name_ [ SET DATA ] TYPE _data_type_ [ COLLATE _collation_ ] [ USING _expression_ ] ALTER [ COLUMN ] _column_name_ SET DEFAULT _expression_ ALTER [ COLUMN ] _column_name_ DROP DEFAULT ALTER [ COLUMN ] _column_name_ { SET | DROP } NOT NULL ALTER [ COLUMN ] _column_name_ SET STATISTICS _integer_ ALTER [ COLUMN ] _column_name_ SET ( _attribute_option_ = _value_ [, ... ] ) ALTER [ COLUMN ] _column_name_ RESET ( _attribute_option_ [, ... ] ) ALTER [ COLUMN ] _column_name_ SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ADD _table_constraint_ [ NOT VALID ] ADD _table_constraint_using_index_ VALIDATE CONSTRAINT _constraint_name_ DROP CONSTRAINT [ IF EXISTS ] _constraint_name_ [ RESTRICT | CASCADE ] DISABLE TRIGGER [ _trigger_name_ | ALL | USER ] ENABLE TRIGGER [ _trigger_name_ | ALL | USER ] ENABLE REPLICA TRIGGER _trigger_name_ ENABLE ALWAYS TRIGGER _trigger_name_ DISABLE RULE _rewrite_rule_name_ ENABLE RULE _rewrite_rule_name_ ENABLE REPLICA RULE _rewrite_rule_name_ ENABLE ALWAYS RULE _rewrite_rule_name_ CLUSTER ON _index_name_ SET WITHOUT CLUSTER SET WITH OIDS SET WITHOUT OIDS SET ( _storage_parameter_ = _value_ [, ... ] ) RESET ( _storage_parameter_ [, ... ] ) INHERIT _parent_table_ NO INHERIT _parent_table_ OF _type_name_ NOT OF OWNER TO _new_owner_ SET TABLESPACE _new_tablespace_ and `_table_constraint_using_index_` is: [ CONSTRAINT _constraint_name_ ] { UNIQUE | PRIMARY KEY } USING INDEX _index_name_ [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] ``` ## 描述 `ALTER TABLE` 改變一個現存表的定義。它有好幾種子形式: `ADD COLUMN` 這種形式使用和[CREATE TABLE](#calibre_link-7)一樣的語法向表中增加一個新的字段。 `DROP COLUMN [ IF EXISTS ]` 這種形式從表中刪除一個字段。和這個字段相關的索引和表約束也會被自動刪除。 如果任何表之外的對象依賴于這個字段,必須使用`CASCADE`選項,比如外鍵約束、視圖等。 如果使用了`IF EXISTS`選項并且相關字段不存在,則在刪除時不會顯示錯誤,僅會有一個提示信息。 `IF EXISTS` 如果使用了`IF EXISTS`選項并且表不存在,則在刪除時不會顯示錯誤,僅會有一個提示信息。。 `SET DATA TYPE` 這種形式改變表中一個字段的類型。該字段涉及的索引和簡單的表約束將被自動地轉換為使用新的字段類型,方法是重新分析最初提供的表達式。 可選的`COLLATE`選項定義了新列的字符集排序方式,如果不加這個選項,則排序方式使用新類型的缺省值。 可選的`USING`選項定義如何從舊的字段值里計算新的字段值;如果省略,那么缺省的轉換就是從舊類型向新類型的賦值轉換。 如果從舊數據類型到新類型沒有隱含或者賦值的轉換,那么必須提供一個`USING`選項。 `SET`/`DROP DEFAULT` 這種形式設置或是刪除一列的缺省值。缺省值僅會對后續的`INSERT`或是`UPDATE`命令,不會影響已經在表中存在的記錄。 `SET`/`DROP NOT NULL` 這種形式修改一個字段是否允許 NULL 值或者拒絕 NULL 值。如果表中字段里包含非 NULL值 ,那么你只可以使用`SET NOT NULL`選項。 `SET STATISTICS` 這種形式為后續的[ANALYZE](#calibre_link-589)操作設置每列的數據統計目標值。 目標值可以設置為0至10000;相應地,設置為-1則會反向使用系統缺省的統計目標值 ([default_statistics_target](#calibre_link-979))。 有關PostgreSQL查詢規劃器使用數據統計方面的更多信息,可以參閱[Section 14.2](#calibre_link-1188)。 `SET (` `_attribute_option_` = `_value_` [, ... ] ) `RESET (` `_attribute_option_` [, ... ] ) 這種形式設置或者重置每個屬性的參數值。目前,已定義的屬性參數值是`n_distinct`和`n_distinct_inherited`, 它們會覆蓋由隨后的[ANALYZE](#calibre_link-589)操作所估算的number-of-distinct-values。 `n_distinct`影響表本身的統計值,而`n_distinct_inherited`影響表及其繼承子表的統計。 當設置為一個正值時,`ANALYZE`將會假定列準確包含明確的非空值的指定數目。 當設置為一個必須大于或者等于-1的負值時,`ANALYZE`將會假定在列中的不同的非空值的數目與表的大小關系是線性的; 確切的統計通過將估算的表大小與給定數字的絕對值相乘來統計。 例如, 值-1意味著在此列中的所有值是不同的,值-0.5意味著每個值平均出現兩次。 當表的大小隨時間變化時這是很有效的,盡管表中行數的乘法運算在查詢規劃計時前是不會這樣計算的, 聲明一個0值來正常地恢復到估計不同數值的數目。 要獲取關于使用PostgreSQL查詢優化器做統計的信息,請參閱[Section 14.2](#calibre_link-1188)。 `SET STORAGE` 這種形式為一個字段設置存儲模式。這個設置控制這個字段是內聯保存還是保存在一個TOAST附屬的表里,以及數據是否要壓縮。 `PLAIN`選項必須用于定長的數值,比如`integer`并且是內聯的、不壓縮的。 `MAIN`用于內聯、可壓縮的數據。 `EXTERNAL`用于外部保存、不壓縮的數據,`EXTENDED`用于外部的壓縮數據。 `EXTENDED`是大多數支持非`PLAIN`存儲的數據的缺省值。 使用`EXTERNAL`將會在`text`和`bytea`字段上的字符串操作更快,但付出的代價是增加了存儲空間。 請注意`SET STORAGE`本身并不改變表上的任何東西,只是設置將來的表操作時,建議使用的策略。參閱[Section 58.2](#calibre_link-80)獲取更多信息。 `ADD` `_table_constraint_` [ NOT VALID ] 這種形式給表增加一個新的約束,使用的語法和[CREATE TABLE](#calibre_link-7)一樣,而與`NOT VALID`選項組合時,這種約束僅在對外鍵和CHECK類藥束有效。 如果約束條件增加了`NOT VALID`選項后,表中已有記錄是否滿足初始約束檢查會被跳過。這種約束會對后續的新增記錄或是記錄更新產生影響(在外鍵約束的情況下, 除非是參照的表中有匹配的記錄,否則這樣的情形會出錯;而在CHECK約束下,除非是新增記錄滿足CHECK約束條件,否則也會也錯)。 但數據庫自身不會認定這種約束會對表中所有記錄生效,除非是在使用了`VALIDATE CONSTRAINT`選項進行了有效性檢查。 `ADD` `_table_constraint_using_index_` 這種形式根據已有的唯一索引給表增加新的`PRIMARY KEY`或`UNIQUE`約束。索引中所有的列也會在包含在約束中。 索引中不能含有表達式列或者是局部索引。另外索引的缺省排序方式應是B-tree類型。這些限制保證了索引會與通過正常`ADD PRIMARY KEY`或`ADD UNIQUE`選項生成的索引相同。 如果使用了`PRIMARY KEY`選項,則索引的列不能已定義為`NOT NULL`,因為這個選項會對涉及的列去執行`ALTER COLUMN SET NOT NULL`。 這也會對全表數據進行掃描以驗證該列是否包含空值,(全表掃描很慢),在其他情況下,這是一個很快的操作。 如果指定了一個約束名,索引將會被重命名為指定的約束中的名稱。相反,約束會被命名為索引名。 在這個命令執行后,約束就相當于是索引的"所有者"了,就如同使用了`ADD PRIMARY KEY`或`ADD UNIQUE`命令創建的索引一樣。 特別要注意的事,這種情況下刪除約束也會清除了索引。 > **Note:** 在新增約束時使用已有的索引對新約束增加時對表記錄的較長時間不能更新的問題有較好的幫助。 使用`CREATE INDEX CONCURRENTLY`指令可以實現這種方式,參見下面的示例。 `VALIDATE CONSTRAINT` 這種形式用于驗證一個外鍵或是一個使用`NOT VALID`選項創建的檢查類約束,通過掃描全表來保證所有記錄都符合約束條件。 如果約束已標記為有效時,什么操作也不會發生。 對大表的記錄進行驗證一般是一個很長的過程,并且目前這種操作還需要`ACCESS EXCLUSIVE`排他類鎖。 初始的不同驗證可以將驗證工作后延至系統不忙時進行,或者通過先花一點額外的時間來糾正可能存在的錯誤以防止新錯誤的發生。 `DROP CONSTRAINT [ IF EXISTS ]` 這種形式刪除一個表中指定的約束,如果使用了 `IF EXISTS`選項并且約束并不存在時,也不會有錯誤產生,僅會有一個提示信息。 `DISABLE`/`ENABLE [ REPLICA | ALWAYS ] TRIGGER` 這種形式禁用或者啟用屬于該表的觸發器。一個被關閉掉的觸發器是系統仍然知道的,但是在觸發器事件發生的時候不會被執行。 對于一個推遲了的觸發器,在觸發事件發生的時候會檢查打開狀態,觸發器相關的函數實際也不會執行。 可以通過指定名字的方法啟用或者禁用任意一個觸發器,或者是該表上的所有觸發器,或者只是用戶自定義的觸發器(這個選項排除了那些用于實現外鍵約束或是可延遲的唯一性約束或是排他性約束的觸發器)。 啟用或者禁用約束觸發器要求超級用戶權限;這么做的時候應該小心,因為如果觸發器不執行的話,約束保證的數據完整性也就沒有辦法確保了。 觸發器啟動原理也受配置變量[session_replication_role](#calibre_link-526)影響。 簡單啟動的觸發器將會在復制任務為"初始"(默認情況)或者"本地"時啟動。 配置為`ENABLE REPLICA`的觸發器將會僅在會話為"replica" 模式時啟動,而配置為`ENABLE ALWAYS`的觸發器將總是會啟動,無論是否為當前復制模式。 `DISABLE`/`ENABLE [ REPLICA | ALWAYS ] RULE` 這種形式配置屬于表的重寫規則制定。一個已禁用的規則對系統來說仍然是可知的,但在查詢重寫期間是不被應用的。 語義為關閉/啟動觸發器。這個配置對`ON SELECT`規則來說是可忽略的,常常用來保持視圖工作,即使當前會話處于一個非默認的復制角色中。 `CLUSTER ON` 這種形式為將來的[CLUSTER](#calibre_link-71)操作選擇默認索引。 實際上并沒有重新盤簇化處理該表。 `SET WITHOUT CLUSTER` 這種形式從表中刪除最近一次用到的[CLUSTER](#calibre_link-71)索引定義。這會影響將來不聲明索引的盤簇化表的操作。 `SET WITH OIDS` 這種形式向表中增加一個`oid`系統字段(參見[Section 5.4](#calibre_link-1155))。 如果表中已存在有OID字段,則操作對表無任何影響。 注意這種形式與`ADD COLUMN oid oid`選項并不相同,后者對給表增加一個普通的字段,只不過它的名稱恰好是叫 `oid`,并非是系統字段。 `SET WITHOUT OIDS` 這種形式從表中刪除 `oid`系統字段。它和`DROP COLUMN oid RESTRICT`完全相同,只不過是如果表上已經沒有`oid`字段的時候不會報錯。 `SET (` `_storage_parameter_` = `_value_` [, ... ] ) 這種形式改變表的一個或者更多存儲參數。參閱[_存儲參數_](#calibre_link-86)獲取關于可用參數的詳細信息。 請注意表的內容將不會因為此命令被立刻調整;根據此參數你可能需要重寫此表來得到希望的效果。 這可以通過[VACUUM FULL](#calibre_link-748)、[CLUSTER](#calibre_link-71)或者`ALTER TABLE`命令中的選項之一來實現。 > **Note:** 盡管`CREATE TABLE`允許`OIDS`在`WITH (``_storage_parameter_`)語義中聲明, 但`ALTER TABLE`不會將`OIDS`作為一個存儲參數。 相反地,要使用`SET WITH OIDS`和`SET WITHOUT OIDS`形式來更改OID狀態。 `RESET (` `_storage_parameter_` [, ... ] ) 這種形式重置表的一個或多個存儲參數為缺省值。與`SET`選項一樣,根據參數的不同可能需要重寫表才能獲得想要的效果。 `INHERIT` `_parent_table_` 這種形式將目標表添加為指定父表的新子表。 之后在父表上的查詢將包含目標表中的記錄。 要被添加為一個子表,目標表必須已經包含所有與父表相同的字段(除此之外 當然也可以包含一些其它字段),這些字段的數據類型必須匹配,并且如果父表的字段有`NOT NULL`約束的話子表的相應字段也必須有`NOT NULL`約束。 所有父表的`CHECK`約束必須同時與子表的約束匹配。 不過一些標記為不可繼承類的約束(類似使用`ALTER TABLE ... ADD CONSTRAINT ... NO INHERIT`創建的約束)不包括在內, 所有子表匹配的約束也不能標記為不可繼承。 目前`UNIQUE`、`PRIMARY KEY`和`FOREIGN KEY`約束不被考慮在內,但是將來可能會有所改變。 `NO INHERIT` `_parent_table_` 這種形式從指定父表的子表列表中刪除目標表。這樣,在父表上的查詢將不再目標表中的記錄。 `OF` `_type_name_` 這種形式將表鏈接至一種復合類型,就好象是使用`CREATE TABLE OF`選項創建表一樣。 表的字段的名稱和類型必須精確匹配復合類型中的定義,不過`oid`系統字段允許不一樣。 表不能是從任何其他表繼承的。 這些限制確保`CREATE TABLE OF`選項允許一個相同的表定義。 `NOT OF` 這種形式將一個與某類型進行關聯的表進行關聯的解除。 `OWNER` 這種形式改變表、序列或是視圖的所有者為一個指定的用戶。 `SET TABLESPACE` 這種形式更改表的表空間為一個指定的表空間,并將與這個表相關的數據文件移至新的表空間。 表上如果有索引,一般不會移動。不過它們也可以通過使用`SET TABLESPACE`命令單獨移動,參見[CREATE TABLESPACE](#calibre_link-99)。 `RENAME` `RENAME`形式改變一個表(或者索引、序列、視圖)的名稱,表中單個字段的名稱,或是表中約束的名稱。 它們對存儲的數據沒有影響。 `SET SCHEMA` 這種形式把表移動到另外一個模式。相關的索引、約束、序列都跟著移動。 除了`RENAME`和`SET SCHEMA`之外所有動作都可以組合在一個多次修改列表中同時使用。 比如,可以在一個命令里增加幾個字段和/或修改幾個字段的類型。 對于大表,這么做特別有用,因為只需要對該表做一次處理。 要使用`ALTER TABLE`,你必須是該表的所有者。 要修改一個表的模式,你還必須在新模式上擁有`CREATE`權限。 要把該表添加為一個父表的新子表,你必須同時是父表的所有者。 要修改所有者,你還必須是新的所有角色的直接或間接成員,并且該成員必須在此表的模式上有`CREATE`權限。 (這些限制強制了修改該所有者不會做任何通過刪除和重建表不能做的事情。不過,超級用戶可以以任何方式修改任意表的所有權。) 增加一個字段或是改變字段的類型或是使用`OF`選項,你也必須對那個數據類型有`USAGE`權限。 ## 參數 `_name_` 要修改的已有表的名稱(可以有模式修飾)。若聲明了`ONLY`選項,則只有那個表被更改。若未聲明`ONLY`,該表及其所有子表都將會被更改。 另外,可以在表名稱后面精確地增加`*`選項來指定包括子表。 `_column_name_` 現存或新的字段名稱。 `_new_column_name_` 現存字段的新名稱。 `_new_name_` 表的新名稱。 `_type_` 新字段的類型,或者現存字段的新類型。 `_table_constraint_` 新的表約束。 `_constraint_name_` 要刪除的現有約束的名字。 `CASCADE` 級聯刪除依賴于被依賴字段或者約束的對象(比如引用該字段的視圖)。 `RESTRICT` 如果字段或者約束還有任何依賴的對象,則拒絕刪除該字段。這是缺省行為。。 `_trigger_name_` 要啟用或者禁用的單個觸發器的名字。 `ALL` 啟用或者禁用所有屬于該表的觸發器。(如果任何觸發器屬于內部會產生約束的觸發器,這要求超級用戶權限,例如那些用于執行外鍵約束或者可推遲的獨特性和排除約束。) `USER` 啟用或者禁用所有屬于表的觸發器,除了任何屬于內部會產生約束的觸發器,例如那些用于執行外鍵約束或者可推遲的獨特性和排除約束。) `_index_name_` 要標記為盤簇化的表上面的索引名字。 `_storage_parameter_` 表的存儲參數的名字。 `_value_` 表的存儲參數的新值,根據參數的不同,可能是一個數字或單詞。 `_parent_table_` 將要與該表建立/取消關聯的父表。 `_new_owner_` 該表的新所有者的用戶名。 `_new_tablespace_` 這個表將要移動到的表空間名字。 `_new_schema_` 表將移動到的新模式的名字。 ## 注意 `COLUMN`關鍵字是多余的,可以省略。。 如果用`ADD COLUMN`增加一個字段,那么所有表中現有行都初始化為該字段的缺省值(如果沒有聲明`DEFAULT`子句,那么就是 NULL)。 添加一個非空缺省值列或者改變一個原有列的類型需要重寫整個表和索引。 不過也有例外,如果使用`USING`選項不改變字段的內容并且字段的新舊類型是二進制兼容的,也可以不重寫表。 添加或者刪除一個系統`oid`列同樣需要重寫整個表。 大表及索引的重寫可能需要非常長的時間,并且也臨時需要兩倍的磁盤空間。 增加一個`CHECK`或`NOT NULL`約束將會掃描該表以保證現有的行符合約束要求。 提供在一個`ALTER TABLE`里面聲明多個修改的主要原因是原先需要的對表的多次掃描和重寫可以組合成一個操作。 `DROP COLUMN`命令并不是物理上把字段刪除,而只是簡單地 把它標記為對 SQL 操作不可見。 隨后對該表的插入和更新將在該字段存儲一個 NULL 。 因此,刪除一個字段是很快的,但是它不會立即釋放表在磁盤上的空間,因為被刪除 了的字段占據的空間還沒有回收。 這些空間將隨著現有的行的更新而得到回收。 (在刪除系統`oid`列時,方式有點不同,這個操作是直接執行了一次表的重寫。) 要強制立刻執行一次表的重寫,可以使用[VACUUM FULL](#calibre_link-748)、[CLUSTER](#calibre_link-71)或是ALTER TABLE命令中的一些形式。 這些命令從可見的語義上不會對表產生更新,但會清除不再有用的數據。 使用`SET DATA TYPE`命令中的`USING`選項實際上可以指定任何表達式涉及到記錄舊值; 也就是說,它可以引用除了正在被轉換的字段之外其它的字段。 這樣,就可以用`SET DATA TYPE`E語法做非常普遍性的轉換。 因為這個靈活性, `USING`表達式并沒有應用于該字段的缺省值(如果有的話);結果可能不是缺省表達式要求的常量表達式。 這就意味著如果從舊類型到新類型沒有隱含或者賦值 轉換的話,那么即使存在`USING`選項,`SET DATA TYPE`也可能無法把缺省值轉換成新的類型。 在這種情況下,應該用`DROP DEFAULT`先刪除缺省值,執行 `ALTER TYPE`,然后使用`SET DEFAULT`增加一個 合適的新缺省值。 類似的考慮也適用于涉及該字段的索引和約束。 如果一個表有子表,那么如果不在子表上做同樣的修改的話,就不允許在父表上增加、 重命名、修改一個字段的類型。 也就是說,`ALTER TABLE ONLY`將被拒絕執行。 這樣就保證了子表總是有和父表匹配的字段。 一個遞歸 `DROP COLUMN`操作將只有在子表并不從任何其它父表中繼承該字段并且從來沒有獨立定義該字段的時候才能刪除一個子表的字段。 一個非遞歸的`DROP COLUMN`(也就是 `ALTER TABLE ONLY ... DROP COLUMN`) 從來不會刪除任何子表字段, 而是把他們標記為獨立定義的(而不是繼承的)。 。 `TRIGGER`、`CLUSTER`、`OWNER`和`TABLESPACE`的操作絕不會遞歸影響到子表; 也就是說,它們的行為就像總是聲明了`ONLY` 一樣。 只有沒有標記為`NO INHERIT`的`CHECK`約束才能添加一個遞歸性的約束。 不允許更改系統表結構的任何部分。 請參考[CREATE TABLE](#calibre_link-7)部分獲取更多有效參數的描述。[Chapter 5](#calibre_link-1570)章節里有更多有關繼承的信息。。 ## 例子 向表中增加一個`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 SET DATA TYPE timestamp with time zone USING timestamp with time zone 'epoch' + foo_timestamp * interval '1 second'; ``` 同樣地,當字段有一個不會自動轉換成新類型的缺省值表達式時: ``` ALTER TABLE foo ALTER COLUMN foo_timestamp DROP DEFAULT, ALTER COLUMN foo_timestamp TYPE timestamp with time zone USING timestamp with time zone 'epoch' + foo_timestamp * interval '1 second', ALTER COLUMN foo_timestamp SET DEFAULT now(); ``` 對現有字段改名: ``` ALTER TABLE distributors RENAME COLUMN address TO city; ``` 更改現有表的名字: ``` ALTER TABLE distributors RENAME TO suppliers; ``` 更改現有約束的名字: ``` ALTER TABLE distributors RENAME CONSTRAINT zipchk TO zip_check; ``` 給一個字段增加一個非空約束: ``` 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 ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT; ``` (這個檢查約束也不會被以后新增的子表繼承。) 刪除一個表及其所有子表的檢查約束: ``` ALTER TABLE distributors DROP CONSTRAINT zipchk; ``` 從表中刪除一個檢查約束(不包含子表): ``` ALTER TABLE ONLY distributors DROP CONSTRAINT zipchk; ``` (這個檢查約束對所有子表仍保留。) 向表中增加一個外鍵約束: ``` ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address); ``` 給表增加一個(多字段)唯一約束: ``` 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; ``` 重新創建一個主鍵約束,并且在主鍵索引在創建時不影響記錄的更新: ``` CREATE UNIQUE INDEX CONCURRENTLY dist_id_temp_idx ON distributors (dist_id); ALTER TABLE distributors DROP CONSTRAINT distributors_pkey, ADD CONSTRAINT distributors_pkey PRIMARY KEY USING INDEX dist_id_temp_idx; ``` ## 兼容性 `ADD` (不包含`USING INDEX`)、`DROP`、`SET DEFAULT`和`SET DATA TYPE` (不包含`USING`)形式與 SQL 標準兼容。 其它形式是PostgreSQL對 SQL 標準 的擴展。還有,在一個`ALTER TABLE`命令里聲明多個操作也是擴展。 `ALTER TABLE DROP COLUMN`可以用于刪除表中的唯一的一個字段,留下一個零字段的表。這是對 SQL 的擴展,它不允許零字段表。 ## 參見 [CREATE TABLE](#calibre_link-7)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看