| PostgreSQL | ||
|---|---|---|
| 上一頁 | 下一頁 | |
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 [, ...] ) ]
另外: 函數的繼承是按照通用Lisp對像系統(CLOS)的習慣進行的。
CREATE TABLE 將向當前資料庫中追加一個表。表將為執行命令者"所有"。
每個 type 可以是簡單型態,復合(集)型態或者一個數組型態。每個屬性都可以聲明為非空並且每個都可以有一個預設值,用 DEFAULT 子句 聲明。
注意:對於 Postgres v6.0,一個屬性內的數組唯數的一致性不是強制的。這一點在以後的版本中將改變。
可選的 INHERITS 子句聲明一個表集合,所創建的表自動從這個表集合裡的表繼承所有字段。如果任何繼承的字段出現次數多於一次,Postgres 報告一個錯誤。Postgres 自動允許所創建的表繼承那些在繼承分級中級別比它高的表的函數。函數的繼承是根據公共 Lisp 對像系統(Common Lisp Object System (CLOS))的習慣進行的。
每個新表或表 table 自動被創建為一個型態。因此表中的一條或更多實例自動就是一個型態,因而可以用於 ALTER TABLE 或其他 CREATE TABLE 語句。
新表將作為一個沒有初始值的堆創建。一個表可以有不超過1600(事實上,這是因為受字段大小必須小於8192字節的限制)列,但是這個限制在一些節點上可以通過配置降低。一個表不能和系統表同名。
DEFAULT value
無
DEFAULT 子句向某列賦一個初始值。(通過在 CREATE TABLE 語句裡面定義)。預設值的型態必須和列/字段定義的數據型態。
一個 INSERT 操作如果包括一個沒有預設值的列/字段,這時如果沒有顯式地提供該/列字段的數據值,將用一個NULL代替。預設的 literal 意味著預設值是聲明的常量。預設的 niladic-function 或 user-function 意味著預設值是在 INSERT 時聲明的函數值。
有兩類 (?)niladic 函數:
在當前的版本 (v6.5), Postgres 在定義表的時候就計算所有預設表達式的值。因為這樣 一些"不可緩存"的函數像 CURRENT_TIMESTAMP 可能不會產生預期的結果。對於日期/時間型態的一些特殊情況,我們可以通過使用一些手段繞過這些情況,像用 “DEFAULT TEXT 'now'” 代替 “DEFAULT 'now'” 或 “DEFAULT CURRENT_TIMESTAMP”。這就強制 Postgres 把日期/時間型態看成字符串常量然後在運行時將它們轉換成(時標)timestamp 值。
給列/字段 did 和 number 賦予一個常量值作為預設值,一個字串賦予列/字段 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 name ] { [
NULL | NOT NULL ] | UNIQUE | PRIMARY KEY | CHECK constraint } [, ...]
可選的約束子句聲明某種約束或者測試,當進行插入或者更新操作時,新的或者更新的記錄必須滿足這個約束或測試時操作才能成功。每個約束必須得出一個布爾表達式。多個字段/屬性可以在一個約束裡面引用。作為表約束的 PRIMARY KEY 的使用是與作為列約束的 PRIMARY KEY 互相衝突不可兼容的。
約束是一個命名的規則:它是一個 SQL 對像,它通過對 INSERT,UPDATE 或 DELETE 等對基本表的操作結果進行限制,進而可以獲得有效的結果集。
有兩種方法定義整合約束:表約束(隨後提到),列/字段約束(將在這裡說明)。
一個列/字段約束是作為列定義的一部分定義的一個整合約束,而且邏輯上一旦創建就會成為表約束。可用的列約束:
| PRIMARY KEY |
| REFERENCES |
| UNIQUE |
| CHECK |
| NOT NULL |
注意: Postgres 還不支援 (版本 6.5)REFERENCES 整合約束。分析器接受 REFERENCES 語法,但將忽略之。
[ CONSTRAINT name ] NOT NULL
NOT NULL 約束表明一個列只能包含非空(non-null)數值的規則。NOT NULL 約束只是一個列約束,不允許作為一個表約束。
在表 distributors 上定義兩個(非空)NOT NULL 列約束,其中一個是命名約束:
CREATE TABLE distributors (
did DECIMAL(3) CONSTRAINT no_null NOT NULL,
name VARCHAR(40) NOT NULL
);
[ CONSTRAINT name ] UNIQUE
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)
);
[ CONSTRAINT name ] CHECK
( condition [, ...] )
CHECK 約束聲明一個列中允許的數據的限制。 CHECK 約束也可以做表約束。
SQL92 CHECK 列約束只能對表中的一列/字段進行定義或使用。Postgres沒有這個限制。
[ CONSTRAINT name ] PRIMARY KEY
PRIMARY KEY 列約束表明表中的一個列/字段只能包含唯一的(不重複),非空的數值。在該列/字段的PRIMARY KEY 約束定義中不需要顯式的包括NOT NULL 約束。
一個表只能聲明一個 PRIMARY KEY。
在同一個表中 PRIMARY KEY 約束定義的列應該應該和其他定義了 UNIQUE 約束的列不同名(不是同一列)。因為這會導致等價索引的重複和增加不必要的處理。然而, Postgres 並沒有明文禁止這些。
[ CONSTRAINT name ] { PRIMARY KEY | UNIQUE } ( column [, ...] )
[ CONSTRAINT name ] CHECK ( constraint )
表約束子句的可能輸出和對應的列/字段約束的輸出一樣.
表約束是對一個基本表的一個或多個列/字段定義的整合約束。"表約束"的四個元素是:
| UNIQUE |
| CHECK |
| PRIMARY KEY |
| FOREIGN KEY |
注意: Postgres 目前(版本 6.5)還不支援 FOREIGN KEY 整合約束。分析器可以理解 FOREIGN KEY 語法,但只是列印一個聲明或者是忽略這個子句。外部鍵字(Foreign keys)可以部分的用觸發器防真。(參考 CREATE TRIGGER 語句)。(譯注:在版本7.0中已經支援外鍵了。Y2K-03-13)
[ CONSTRAINT name ] UNIQUE ( column [, ...] )
UNIQUE 約束表明表刈豽一個或若干個獨立的列/字段組成的集合只能包含唯一的數值。表的 UNIQUE 約束和對應的列/字段約束的特性是一樣的,區別是表約束可以跨越多個列/字段。
請參考列/字段的 UNIQUE 約束獲取更多細節。
給一個表 distributors 定義一個 UNIQUE 表約束:
CREATE TABLE distributors (
did DECIMAL(03),
name VARCHAR(40),
UNIQUE(name)
);
[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] )
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還定義了一條 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;
SQL92 對 UNIQUE 定義了一些附加的功能。
表約束定義:
[ CONSTRAINT name ] UNIQUE ( column [, ...] )
[ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ]
[ [ NOT ] DEFERRABLE ]
列/字段約束定義:
[ CONSTRAINT name ] UNIQUE
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
NULL "約束" (實際上不是一個約束)是一個 Postgres 對SQL92的擴展,把它包含進來是為了和 NOT NULL 子句對稱。因為這是任何列的預設,它的出現只是添亂。
[ CONSTRAINT name ] NULL
SQL92 對 NOT NULL 聲明了一些附加的功能:
[ CONSTRAINT name ] NOT NULL
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
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 (約束)定義可以包含一個任意順序的延遲屬性的子句和/或一個初始化約束式子句。
每個約束的約束模式總是有一個初始化預設值,該值在事務開始時為該約束設定。
SQL92 對 CHECK 聲明了一些附加功能,不管是表約束還是列/字段約束。
表約束定義:
[ CONSTRAINT name ] CHECK ( VALUE condition )
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
列約束定義:
[ CONSTRAINT name ] CHECK ( VALUE condition )
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
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 |