PostgreSQL
上一頁   下一頁

CREATE TABLE

名稱

CREATE TABLE ─ 創建一個新表

CREATE [ TEMPORARY | TEMP ] TABLE table (
    column type
    [ NULL | NOT NULL ] [ UNIQUE ] [ DEFAULT value ]
    [column_constraint_clause | PRIMARY KEY } [ ... ] ]
    [, ... ]
    [, PRIMARY KEY ( column [, ...] ) ]
    [, CHECK ( condition ) ]
    [, table_constraint_clause ]
    ) [ INHERITS ( inherited_table [, ...] ) ]
  

輸入

TEMPORARY
此表只是為這次會話創建,並且在會話結束後自動刪除。當臨時表存在時,同名的永久表是不可見的。
table
將要創建的新表的名稱。
column
列/字段名.
type
列/字段型態。這裡可以包括數組的聲明。請參考 PostgreSQL 用戶手冊 獲取關於數據型態和數組的詳細資訊。
DEFAULT value
一個列/字段的預設值。請參考 DEFAULT 子句獲取更多資訊。
column_constraint_clause
可選的列/字段約束子句,聲明一系列整合的約束和測試,當對表進行更新或插入操作時必須滿足這些約束條件才能成功。每個約束必須產生一個布爾式。盡管 SQL92 需要 column_constraint_clause 用於指定某一行,Postgres 允許在用一個列/字段的約束索引多個列。請參考列約束子句獲取更多資訊。
table_constraint_clause
可選的表(約束) CONSTRAINT 子句,聲明一系列整合的約束,當對表進行更新或插入時必須滿足這些約束。每個約束必須產生一個布爾表達式。可以對多列使用同一個約束。一個表只能聲明一個 PRIMARY KEY 子句﹔PRIMARY KEY column (表約束)和 PRIMARY KEY (列/字段約束)是互斥的。 請參考表約束子句獲取更多資訊。
INHERITS inherited_table
可選的(繼承)INHERITS 子句聲明一系列表名,這個表將自動從這些表繼承所有字段。如果任何繼承域出現的次數超過一次,Postgres 將報告一個錯誤。 Postgres 自動地允許所創建的表繼承所有其父表的函數。

另外: 函數的繼承是按照通用Lisp對像系統(CLOS)的習慣進行的。

輸出

CREATE
成功創建表後的返回資訊。
ERROR
如果創建表失敗,返回此資訊。通常還跟隨一些描述文本,例如:ERROR: Relation 'table' already exists 在運行時出現,因為所聲明的表已經在資料庫中存在。
ERROR: DEFAULT: type mismatched
如果預設數值的型態和字段定義的型態不一樣,返回此錯誤。

描述

CREATE TABLE 將向當前資料庫中追加一個表。表將為執行命令者"所有"。

每個 type 可以是簡單型態,復合(集)型態或者一個數組型態。每個屬性都可以聲明為非空並且每個都可以有一個預設值,用 DEFAULT 子句 聲明。

注意:對於 Postgres v6.0,一個屬性內的數組唯數的一致性不是強制的。這一點在以後的版本中將改變。

可選的 INHERITS 子句聲明一個表集合,所創建的表自動從這個表集合裡的表繼承所有字段。如果任何繼承的字段出現次數多於一次,Postgres 報告一個錯誤。Postgres 自動允許所創建的表繼承那些在繼承分級中級別比它高的表的函數。函數的繼承是根據公共 Lisp 對像系統(Common Lisp Object System (CLOS))的習慣進行的。

每個新表或表 table 自動被創建為一個型態。因此表中的一條或更多實例自動就是一個型態,因而可以用於 ALTER TABLE 或其他 CREATE TABLE 語句。

新表將作為一個沒有初始值的堆創建。一個表可以有不超過1600(事實上,這是因為受字段大小必須小於8192字節的限制)列,但是這個限制在一些節點上可以通過配置降低。一個表不能和系統表同名。

DEFAULT 子句

DEFAULT value
   

輸入

value
預設的表達式值可以是: 

輸出

描述

DEFAULT 子句向某列賦一個初始值。(通過在 CREATE TABLE 語句裡面定義)。預設值的型態必須和列/字段定義的數據型態。

一個 INSERT 操作如果包括一個沒有預設值的列/字段,這時如果沒有顯式地提供該/列字段的數據值,將用一個NULL代替。預設的 literal 意味著預設值是聲明的常量。預設的 niladic-functionuser-function 意味著預設值是在 INSERT 時聲明的函數值。

有兩類 (?)niladic 函數:

niladic USER
CURRENT_USER / USER
參閱 CURRENT_USER 函數
SESSION_USER
還不支援
SYSTEM_USER
還不支援
niladic datetime
CURRENT_DATE
參閱 CURRENT_DATE 函數
CURRENT_TIME
參閱 CURRENT_DATE 函數
CURRENT_TIMESTAMP
參閱 CURRENT_TIMESTAMP 函數

在當前的版本 (v6.5), Postgres 在定義表的時候就計算所有預設表達式的值。因為這樣 一些"不可緩存"的函數像 CURRENT_TIMESTAMP 可能不會產生預期的結果。對於日期/時間型態的一些特殊情況,我們可以通過使用一些手段繞過這些情況,像用 “DEFAULT TEXT 'now'” 代替 “DEFAULT 'now'” 或 “DEFAULT CURRENT_TIMESTAMP”。這就強制 Postgres 把日期/時間型態看成字符串常量然後在運行時將它們轉換成(時標)timestamp 值。

用法

給列/字段 didnumber 賦予一個常量值作為預設值,一個字串賦予列/字段 did:

CREATE TABLE video_sales (
    did      VARCHAR(40) DEFAULT 'luso films',
    number   INTEGER DEFAULT 0,
    total    CASH DEFAULT '$0.0'
);
    

將一個現有的序列作為列did 的預設值,並且給列/字段 name 一個字符串值:

CREATE TABLE distributors (
    did      DECIMAL(3)  DEFAULT NEXTVAL('serial'),
    name     VARCHAR(40) DEFAULT 'luso films'
);
    

列/字段 CONSTRAINT 子句

[ CONSTRAINT name ] { [
    NULL | NOT NULL ] | UNIQUE | PRIMARY KEY | CHECK constraint } [, ...]
   

輸入

name
賦予整個約束的任意名稱。如果沒有聲明 name ,將從表和列名稱刈谹成一個唯一的名稱用於 name。
NULL
列允許包含 NULL 值。這是預設值。
NOT NULL
列不允許包含 NULL 值。與包含 CHECK 的列/字段相同(column NOT NULL)。
UNIQUE
列/字段必須有一個唯一值。在 Postgres 這是通過在表上隱含地創建一個唯一索引實現的。
PRIMARY KEY
本列是一個主鍵,暗示著其唯一性是由系統強制提供的而且其他表可能依賴此列/字段作為行標識。 請參考 PRIMARY KEY 獲取更多的資訊。
constraint
約束的定義。

描述

可選的約束子句聲明某種約束或者測試,當進行插入或者更新操作時,新的或者更新的記錄必須滿足這個約束或測試時操作才能成功。每個約束必須得出一個布爾表達式。多個字段/屬性可以在一個約束裡面引用。作為表約束的 PRIMARY KEY 的使用是與作為列約束的 PRIMARY KEY 互相衝突不可兼容的。

約束是一個命名的規則:它是一個 SQL 對像,它通過對 INSERT,UPDATE 或 DELETE 等對基本表的操作結果進行限制,進而可以獲得有效的結果集。

有兩種方法定義整合約束:表約束(隨後提到),列/字段約束(將在這裡說明)。

一個列/字段約束是作為列定義的一部分定義的一個整合約束,而且邏輯上一旦創建就會成為表約束。可用的列約束:

PRIMARY KEY
REFERENCES
UNIQUE
CHECK
NOT NULL

注意: Postgres 還不支援 (版本 6.5)REFERENCES 整合約束。分析器接受 REFERENCES 語法,但將忽略之。

NOT NULL 約束

[ CONSTRAINT name ] NOT NULL 
   

NOT NULL 約束表明一個列只能包含非空(non-null)數值的規則。NOT NULL 約束只是一個列約束,不允許作為一個表約束。

輸出

status
ERROR: ExecAppend: Fail to add null value in not null attribute "column".
當試圖向一個有 NOT NULL 約束的列插入一個空值時返回此運行時錯誤。

描述

用法

在表 distributors 上定義兩個(非空)NOT NULL 列約束,其中一個是命名約束:

CREATE TABLE distributors (
    did      DECIMAL(3) CONSTRAINT no_null NOT NULL,
    name     VARCHAR(40) NOT NULL
);
     

UNIQUE 約束

[ CONSTRAINT name ] UNIQUE
   

輸入

CONSTRAINT name
賦予一個約束的任意標記。

輸出

status
ERROR: Cannot insert a duplicate key into a unique index.
如果試圖向列/字段中插入一個重複數值,返回此運行時錯誤。

描述

UNIQUE 約束表明一個這樣的規則:表中一組由一個或多個獨立列組成的集合刈荿能包含一個唯一的數值。

一個列/字段定義包含了 UNIQUE 約束,不一定要包含 NOT NULL 約束。在一個沒有NOT NULL 約束的列/字段列如果有多個空值並不違反 UNIQUE 約束。(這與 SQL92 定義不一致,但卻是更有意義的習慣。 請參閱兼容性部分獲取更多細節。)

每個 UNIQUE 列約束必須賦予一個該表中沒有被其他 UNIQUE 或 PRIMARY KEY 約束定義過的列/字段上。

注意: Postgres 自動為每個 UNIQUE 約束創建一個唯一索引,以保証數據完整性。請參閱 CREATE INDEX 獲取更多資訊。

用法

為表 distributors 定義一個 UNIQUE 列約束。 UNIQUE 列約束只能給表中一個列定義:

CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40) UNIQUE
);
  

與下面的表約束相同:

CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40),
    UNIQUE(name)
);
     

CHECK (檢查)約束

[ CONSTRAINT name ] CHECK
    ( condition [, ...] ) 
   

輸入

name
賦予約束的任意名稱。
condition
任何有效的產生一個布爾值的條件表達式。

輸出

status
ERROR: ExecAppend: rejected due to CHECK constraint "table_column".
如果試圖向列/字段中插入一個違反 CHECK 約束的數值,產生此運行時錯誤。

描述

CHECK 約束聲明一個列中允許的數據的限制。 CHECK 約束也可以做表約束。

SQL92 CHECK 列約束只能對表中的一列/字段進行定義或使用。Postgres沒有這個限制。

PRIMARY KEY 約束

[ CONSTRAINT name ] PRIMARY KEY 
   

輸入

CONSTRAINT name
約束的任意名稱。

輸出

ERROR: Cannot insert a duplicate key into a unique index.
當你試圖向一個有PRIMARY KEY 約束的列插入一個重複的數值時,將返回這個運行時資訊。

描述

PRIMARY KEY 列約束表明表中的一個列/字段只能包含唯一的(不重複),非空的數值。在該列/字段的PRIMARY KEY 約束定義中不需要顯式的包括NOT NULL 約束。

一個表只能聲明一個 PRIMARY KEY。

注意

Postgres 自動創建一個唯一索引以保証數據的完整性。(參閱 CREATE INDEX 語句)

在同一個表中 PRIMARY KEY 約束定義的列應該應該和其他定義了 UNIQUE 約束的列不同名(不是同一列)。因為這會導致等價索引的重複和增加不必要的處理。然而, Postgres 並沒有明文禁止這些。

表(約束) CONSTRAINT 子句

[ CONSTRAINT name ] { PRIMARY KEY |  UNIQUE } ( column [, ...] )
[ CONSTRAINT name ] CHECK ( constraint )
   

輸入

CONSTRAINT name
整合約束的任意名稱。
column [, ...]
用於定義唯一索引,或 PRIMARY KEY,或 NOT NULL 約束的列/字段名。
CHECK ( constraint )
要作為約束進行估值的布爾表達式。

輸出

表約束子句的可能輸出和對應的列/字段約束的輸出一樣.

描述

表約束是對一個基本表的一個或多個列/字段定義的整合約束。"表約束"的四個元素是:

UNIQUE
CHECK
PRIMARY KEY
FOREIGN KEY

注意: Postgres 目前(版本 6.5)還不支援 FOREIGN KEY 整合約束。分析器可以理解 FOREIGN KEY 語法,但只是列印一個聲明或者是忽略這個子句。外部鍵字(Foreign keys)可以部分的用觸發器防真。(參考 CREATE TRIGGER 語句)。(譯注:在版本7.0中已經支援外鍵了。Y2K-03-13)

UNIQUE 約束

[ CONSTRAINT name ] UNIQUE ( column [, ...] )
    

輸入

CONSTRAINT name
賦予約束的任意名稱。
column
某表中的列/字段名。

輸出

status
ERROR: Cannot insert a duplicate key into a unique index
如果試圖向列中插入一個重複的值,將返回此錯誤。

描述

UNIQUE 約束表明表刈豽一個或若干個獨立的列/字段組成的集合只能包含唯一的數值。表的 UNIQUE 約束和對應的列/字段約束的特性是一樣的,區別是表約束可以跨越多個列/字段。

請參考列/字段的 UNIQUE 約束獲取更多細節。

用法

給一個表 distributors 定義一個 UNIQUE 表約束:

CREATE TABLE distributors (
    did      DECIMAL(03),
    name     VARCHAR(40),
    UNIQUE(name)
);
     

PRIMARY KEY 約束

[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] ) 
    

輸入

CONSTRAINT name
賦予約束的任意名稱。
column [, ...]
表中的一個或者多個列。

輸出

status
ERROR: Cannot insert a duplicate key into a unique index.
如果試圖向一個有 PRIMARY KEY 約束的表中插入重複值,返回這個運行時命令。

描述

PRIMARY KEY 約束表明某個表的由一個或多個列/字段組成的集合只能包含唯一,(不重複),非空數值。對聲明的列定義的 PRIMARY KEY 約束不需要包括 NOT NULL 約束。

PRIMARY KEY 表約束與列/字段約束相似,區別是它具有控制多列/字段的能力。

請參考 PRIMARY KEY 列/字段約束部分獲取更多資訊。

用法

創建表 films 和表 distributors :

CREATE TABLE films (
     code      CHARACTER(5) CONSTRAINT firstkey PRIMARY KEY,
     title     CHARACTER VARYING(40) NOT NULL,
     did       DECIMAL(3) NOT NULL,
     date_prod DATE,
     kind      CHAR(10),
     len       INTERVAL HOUR TO MINUTE
);
   
CREATE TABLE distributors (
     did      DECIMAL(03) PRIMARY KEY DEFAULT NEXTVAL('serial'),
     name     VARCHAR(40) NOT NULL CHECK (name <> '')
);
   

創建一個有2維數組的表:

   CREATE TABLE array (
          vector INT[][]
          );
   

給 films 表定義一個 UNIQUE 表約束。UNIQUE 可以定義在表的一個或多個列/字段上:

CREATE TABLE films (
    code      CHAR(5),
    title     VARCHAR(40),
    did       DECIMAL(03),
    date_prod DATE,
    kind      CHAR(10),
    len       INTERVAL HOUR TO MINUTE,
    CONSTRAINT production UNIQUE(date_prod)
);
   

定義一個 CHECK 列約束:

CREATE TABLE distributors (
    did      DECIMAL(3) CHECK (did > 100),
    name     VARCHAR(40)
);
   

定義一個 CHECK 表約束:

CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40)
    CONSTRAINT con1 CHECK (did > 100 AND name > '')
);
   

為表 films 定義一個 PRIMARY KEY 表約束。PRIMARY KEY 表約束可以對一個或多個列/字段進行定義:

CREATE TABLE films (
    code      CHAR(05),
    title     VARCHAR(40),
    did       DECIMAL(03),
    date_prod DATE,
    kind      CHAR(10),
    len       INTERVAL HOUR TO MINUTE,
    CONSTRAINT code_title PRIMARY KEY(code,title)
);
   

為表 distributors 定義一個 PRIMARY KEY 列約束。 PRIMARY KEY 列約束只能對表中的一個列/字段定義。( 下面兩個例子是相當的 ):

CREATE TABLE distributors (
    did      DECIMAL(03),
    name     CHAR VARYING(40),
    PRIMARY KEY(did)
); 
   
CREATE TABLE distributors (
    did      DECIMAL(03) PRIMARY KEY,
    name     VARCHAR(40)
);
   

注意

CREATE TABLE/INHERITS 是 Postgres 語言擴展。

兼容性

SQL92

除了本地可見的臨時表外,SQL92還定義了一條 CREATE GLOBAL TEMPORARY TABLE 語句,和一個可選的 ON COMMIT 子句:

CREATE GLOBAL TEMPORARY TABLE table ( column type [
    DEFAULT value ] [ CONSTRAINT column_constraint ] [, ...] )
    [ CONSTRAINT table_constraint ] [ ON COMMIT { DELETE | PRESERVE } ROWS ] 
   

對於臨時表,CREATE TEMPORARY TABLE 語句定義一個其他客戶端可見的新表和定義表的列/字段和約束。

CREATE TEMPORARY TABLE 可選的 ON COMMIT 子句用於聲明當 COMMIT 事務時,是否需要將臨時表的行清空。如果 ON COMMIT 子句省略了,(預設值),就設為 ON COMMIT DELETE ROWS (當COMMIT時清空)。

要創建一個臨時表:

CREATE TEMPORARY TABLE actors (
    id         DECIMAL(03),
    name       VARCHAR(40),
    CONSTRAINT actor_id CHECK (id < 150)
) ON COMMIT DELETE ROWS;
    

UNIQUE 子句

SQL92 對 UNIQUE 定義了一些附加的功能。

表約束定義:

[ CONSTRAINT name ] UNIQUE ( column [, ...] )
    [ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ]
    [ [ NOT ] DEFERRABLE ]
     

列/字段約束定義:

[ CONSTRAINT name ] UNIQUE
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
     

NULL 子句

NULL "約束" (實際上不是一個約束)是一個 Postgres 對SQL92的擴展,把它包含進來是為了和 NOT NULL 子句對稱。因為這是任何列的預設,它的出現只是添亂。

[ CONSTRAINT name ] NULL 
     

NOT NULL 子句

SQL92 對 NOT NULL 聲明了一些附加的功能:

[ CONSTRAINT name ] NOT NULL 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

CONSTRAINT 子句

SQL92 對約束聲明了一些附加的功能,並且還定義了斷言和域(domain)約束。

注意: Postgres 還不支援域(domain)和斷言。

一個斷言是一種特殊型態的整合約束,並且和其他約束共享相同的名字空間(namespace)。不過,一個斷言不像約束那樣必須依賴於某個基本表,所以 SQL-92 提供了一個 CREATE ASSERTION 語句作為定義約束的一個可選的手段:

CREATE ASSERTION name CHECK ( condition )
    

域約束是用 CREATE DOMAIN 或 ALTER DOMAIN 語句定義的:

域約束:

[ CONSTRAINT name ] CHECK constraint 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

表約束定義:

[ CONSTRAINT name ] { PRIMARY KEY ( column, ... ) | FOREIGN KEY constraint | UNIQUE constraint | CHECK constraint }
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

列約束定義:

[ CONSTRAINT name ] { NOT NULL | PRIMARY KEY | FOREIGN KEY constraint | UNIQUE | CHECK constraint }  
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

一個 CONSTRAINT (約束)定義可以包含一個任意順序的延遲屬性的子句和/或一個初始化約束式子句。

NOT DEFERRABLE
意味著每條 SQL 語句執行後都必須校驗是否違反約束規則。
DEFERRABLE
意味著,當事務開始後,對約束的檢查可以推遲到晚些時候,但不晚於當前事務的結束

每個約束的約束模式總是有一個初始化預設值,該值在事務開始時為該約束設定。

INITIALLY IMMEDIATE
意思是,從事務開始時開始,在每條 SQL 語句執行後約束都必須對其規則進行合法性檢查,看看有無違反。
INITIALLY DEFERRED
意思是,從事務開始時開始,對約束的檢查可以推遲到稍後進行,但是不遲於本次事務的結束。

CHECK 子句

SQL92 對 CHECK 聲明了一些附加功能,不管是表約束還是列/字段約束。

表約束定義:

[ CONSTRAINT name ] CHECK ( VALUE condition ) 
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
     

列約束定義:

[ CONSTRAINT name ] CHECK ( VALUE condition ) 
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
    

PRIMARY KEY 子句

SQL92 為 PRIMARY KEY 聲明了一些附加的功能:

表約束定義:

[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] ) 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

列約束定義:

[ CONSTRAINT name ] PRIMARY KEY 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

上一頁 首頁 下一頁
CREATE SEQUENCE 開頭 CREATE TABLE AS