CREATE TABLE
CREATE [ TEMPORARY | TEMP ] TABLE table_name ( { column_nametype [ column_constraint [ ... ] ] | table_constraint } [, ... ] ) [ INHERITS ( inherited_table [, ... ] ) ] 這里 column_constraint 可以是: [ CONSTRAINT constraint_name ] { NOT NULL | NULL | UNIQUE | PRIMARY KEY | DEFAULT value | CHECK (condition) | REFERENCES table [ ( column ) ] [ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ] [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] } 而 table_constraint 可以是: [ CONSTRAINT constraint_name ] { UNIQUE ( column_name [, ... ] ) | PRIMARY KEY ( column_name [, ... ] ) | CHECK ( condition ) | FOREIGN KEY ( column_name [, ... ] ) REFERENCES table [ ( column [, ... ] ) ] [ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ] [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] }
輸入
- TEMPORARY 或 TEMP
-
如果聲明了這個(gè)參數(shù),那么 此表只是為這次會(huì)話(huà)創(chuàng)建,并且在會(huì)話(huà)結(jié)束后自動(dòng)刪除。 當(dāng)臨時(shí)表存在時(shí),同名的永久表(在本次會(huì)話(huà)中)是不可見(jiàn)的。 任何在臨時(shí)表上創(chuàng)建的索引也自動(dòng)的是臨時(shí)的.
- table_name
-
將要?jiǎng)?chuàng)建的新表的名稱(chēng).
- column_name
-
在這個(gè)新表中要?jiǎng)?chuàng)建的列/字段名.
- type
-
列/字段類(lèi)型.這里可以包括數(shù)組的聲明.請(qǐng)參考 PostgreSQL 用戶(hù)手冊(cè) 獲取關(guān)于數(shù)據(jù)類(lèi)型和數(shù)組的詳細(xì)信息.
- inherited_table
-
可選的 INHERITS 子句聲明一個(gè)表名字列表,而這個(gè)表從這些表中 自動(dòng)繼承所有字段.如果有任何繼承過(guò)來(lái)的字段名字出現(xiàn)次數(shù)多于一次, 那么 Postgres 報(bào)告一個(gè)錯(cuò)誤. Postgres 自動(dòng)地允許所創(chuàng)建的表繼承所有其祖先表的函數(shù).
- constraint_name
-
一個(gè)字段或表約束的可選的名字.如果沒(méi)有聲明,系統(tǒng)生成一個(gè).
- value
-
一個(gè)列/字段的缺省值.請(qǐng)參考 DEFAULT 子句獲取更多信息.
- condition
-
CHECK 子句聲明完整性約束或者檢查一些新行或更新行在插入和更新操作時(shí) 要想成功必須滿(mǎn)足的條件.每個(gè)約束都必須是一個(gè)生成一個(gè)布爾變量的表達(dá)式. 一個(gè)在某字段里出現(xiàn)的條件應(yīng)該只引用該字段的數(shù)值,而一個(gè)作為表約束 出現(xiàn)的條件可以引用多個(gè)字段.
- table
-
被一個(gè)外鍵約束引用的現(xiàn)存表的名字.
- column
-
被一個(gè)外鍵約束引用的現(xiàn)存的表的字段名字.如果沒(méi)有聲明,則假設(shè)是 該表的主鍵.
- action
-
一個(gè)關(guān)鍵字,聲明在違反外鍵約束的時(shí)候要執(zhí)行的動(dòng)作.
描述
CREATE TABLE 將向當(dāng)前數(shù)據(jù)庫(kù)中追加一個(gè)表. 表將為執(zhí)行命令者"所有".
每個(gè) type 可以是簡(jiǎn)單類(lèi)型,復(fù)合(集合)類(lèi)型或者一個(gè)數(shù)組類(lèi)型。 每個(gè)屬性都可以聲明為非空并且每個(gè)都可以有一個(gè)缺省值,用 DEFAULT 子句 聲明。
注意: 一個(gè)屬性?xún)?nèi)的數(shù)組維數(shù)的一致性不是強(qiáng)制的。這一點(diǎn)在以后的版本中可能將改變。
CREATE TABLE 還自動(dòng)創(chuàng)建一個(gè)代表元組類(lèi)型(結(jié)構(gòu)類(lèi)型) 的數(shù)據(jù)類(lèi)型,該類(lèi)型對(duì)應(yīng)該表的一行.因此,表不能和任何現(xiàn)存數(shù)據(jù)類(lèi)型同名.
可選的 INHERITS 子句聲明一個(gè)表集合, 所創(chuàng)建的表自動(dòng)從這個(gè)表集合里的表繼承所有字段。 如果任何繼承的字段出現(xiàn) 次數(shù)多于一次,Postgres 報(bào)告一個(gè)錯(cuò)誤。 Postgres 自動(dòng)允許所創(chuàng)建的表繼承那些在繼承分級(jí)中級(jí)別比它高的表的函數(shù)。函 數(shù)的繼承是根據(jù)公共 Lisp 對(duì)象系統(tǒng) (Common Lisp Object System (CLOS))的習(xí)慣進(jìn)行的。
新表將作為一個(gè)沒(méi)有初始值的堆創(chuàng)建.一個(gè)表可以有不超過(guò)1600 (實(shí)際上,因?yàn)槭茏侄未笮∠拗?,?shí)際的上限還要低)列, 一個(gè)表不能和系統(tǒng)表同名.
DEFAULT 子句
DEFAULT value
DEFAULT 子句向某字段賦一個(gè)初始值,該字段就是這個(gè)定義出現(xiàn)的字段. 其值可以是任意生成變量的表達(dá)式. (請(qǐng)注意還不支持子查詢(xún)和對(duì)本表其它字段的交叉引用). 缺省值的類(lèi)型必須和列/字段定義的數(shù)據(jù)類(lèi)型.
如果在 INSERT 操作中沒(méi)有聲明該字段的數(shù)值, 那么將使用 DEFAULT 表達(dá)式的值. 如果沒(méi)有 DEFAULT 子句,則缺省是 NULL.
用法
CREATE TABLE distributors ( name VARCHAR(40) DEFAULT 'luso films', did INTEGER DEFAULT NEXTVAL('distributors_serial'), modtime TIMESTAMP DEFAULT now() );上面的東西給字段 name 賦與了一個(gè)文本常量缺省值, 并且給字段 did 安排了一個(gè)缺省值,該值是從一個(gè)序列 對(duì)象中選出的下一個(gè)值得出的.modtime 的缺省值將是 該行插入的時(shí)間.
有一點(diǎn)值得我們指出的是
modtime TIMESTAMP DEFAULT 'now'生成的結(jié)果可能不是我們想要的:字串 'now' 將被立即轉(zhuǎn)換成一個(gè) timestamp 值,因此 modtime 的缺省值將總是表創(chuàng)建的時(shí)間.我們可以通過(guò)把缺省值聲明為一個(gè)函數(shù) 調(diào)用來(lái)避免這種困難.
列/字段 CONSTRAINT 子句
[ CONSTRAINT constraint_name ] { NULL | NOT NULL | UNIQUE | PRIMARY KEY | CHECK condition | REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] [ [ NOT ] DEFERRABLE ] [ INITIALLY checktime ] }
輸入
- constraint_name
-
賦予整個(gè)約束的任意名稱(chēng).
- NULL
-
列允許包含 NULL 值。這是缺省值。
- NOT NULL
-
列不允許包含 NULL 值.與包含 CHECK 的列/字段相同 CHECK (column NOT NULL).
- UNIQUE
-
列/字段必須有一個(gè)唯一值.在 Postgres 這是通過(guò)在表上隱含地創(chuàng)建一個(gè)唯一索引實(shí)現(xiàn)的.
- PRIMARY KEY
-
本列是一個(gè)主鍵, 暗示著其唯一性是由系統(tǒng)強(qiáng)制提供的而且其他表可能依賴(lài)此列/字段作為 唯一的行標(biāo)識(shí). PRIMARY KEY 蘊(yùn)涵 UNIQUE 和 NOT NULL 約束. 請(qǐng)參考 PRIMARY KEY 獲取更多的信息.
- condition
-
任意布爾值約束條件.
描述
可選的約束子句聲明某種約束或者測(cè)試,當(dāng)進(jìn)行插入或者更新操作時(shí), 新的或者更新的元組必須滿(mǎn)足這個(gè)約束或測(cè)試時(shí)操作才能成功。
約束是一個(gè)命名的規(guī)則:它是一個(gè) SQL 對(duì)象,它通過(guò)對(duì) INSERT, UPDATE 或 DELETE 等對(duì)基本表的操作結(jié)果進(jìn)行限 制,進(jìn)而可以獲得有效的結(jié)果集.
有兩種方法定義完整性約束:表約束(隨后提到), 列/字段約束(將在這里說(shuō)明).
一個(gè)列/字段約束是作為列定義的一部分定義的一個(gè)整合約束, 而且邏輯上一旦創(chuàng)建就會(huì)成為表約束.可用的列約束:
PRIMARY KEY |
REFERENCES |
UNIQUE |
CHECK |
NOT NULL |
NOT NULL 約束
[ CONSTRAINT name ] NOT NULL
NOT NULL 約束表明一個(gè)列只能包含非空(non-null)數(shù)值的規(guī)則. NOT NULL 約束只是一個(gè)列約束,不允許作為一個(gè)表約束.
UNIQUE (唯一)約束
[ CONSTRAINT constraint_name ] UNIQUE
Outputs
- status
-
- ERROR: Cannot insert a duplicate key into a unique index.
-
如果試圖向列/字段中插入一個(gè)重復(fù)數(shù)值,返回此運(yùn)行時(shí)錯(cuò)誤.
描述
UNIQUE 約束表明一個(gè)這樣的規(guī)則: 表中一組由一個(gè)或多個(gè)獨(dú)立列組成的集合中只能包含一個(gè)唯一的數(shù)值.
一個(gè)列/字段定義包含了 UNIQUE 約束,不一定要包含 NOT NULL 約束. 在一個(gè)沒(méi)有NOT NULL 約束的列/字段列如果有多個(gè)空值并不違反 UNIQUE 約束. (這與 SQL92 定義不一致,但卻是更有意義的習(xí)慣. 請(qǐng)參閱兼容性部分獲取更多細(xì)節(jié).)
每個(gè) UNIQUE 列約束必須賦予一個(gè)該表中沒(méi)有被其他 UNIQUE 或 PRIMARY KEY 約束定義過(guò)的列/字段上.
注意: Postgres 自動(dòng)為每個(gè) UNIQUE 約束創(chuàng)建 一個(gè)唯一索引,以保證數(shù)據(jù)完整性. 請(qǐng)參閱 CREATE INDEX 獲取更多信息.
CHECK (檢查)約束
[ CONSTRAINT constraint_name ] CHECK ( condition )
輸出
- status
-
- ERROR: ExecAppend: rejected due to CHECK constraint "constraint_name".
-
此錯(cuò)誤發(fā)生在運(yùn)行時(shí), 如果試圖向列/字段中插入一個(gè)違反 CHECK 約束的非法數(shù)值.
描述
CHECK 約束聲明一個(gè)列中允許的數(shù)據(jù)的限制. CHECK 約束也可以做表約束.
CHECK 聲明一個(gè)涉及到一個(gè)表中一個(gè)或多個(gè)字段的一般的布爾表達(dá)失. 如果給某行的這些字段提供的數(shù)值經(jīng)這個(gè)表達(dá)式計(jì)算出 FALSE,那么 該新行將被拒絕.
目前,CHECK 表達(dá)式不能包含子查詢(xún),也不能引用除了當(dāng)前行里的字段之外的 其它變量.
SQL92 CHECK 列約束只能對(duì)表中的一列/字段進(jìn)行定義或使用. Postgres 沒(méi)有這個(gè)限制. 它把列約束和表約束一視同仁.
PRIMARY KEY (主鍵)約束
[ CONSTRAINT constraint_name ] PRIMARY KEY
輸出
- ERROR: Cannot insert a duplicate key into a unique index.
-
當(dāng)你試圖向一個(gè)有 PRIMARY KEY 約束的列插入一個(gè)重復(fù)的數(shù)值時(shí), 將返回這個(gè)運(yùn)行時(shí)信息.
REFERENCES 約束
[ CONSTRAINT constraint_name ] REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] [ [ NOT ] DEFERRABLE ] [ INITIALLY checktime ]
REFERENCES (參考)約束聲明了一個(gè)規(guī)則: 一個(gè)字段的數(shù)值要與另外一個(gè)字段的數(shù)值做對(duì)比檢查. REFERENCES 還 可以做為一個(gè) FOREIGN KEY 表約束的一部分聲明.
輸入
- constraint_name
-
約束的任意名稱(chēng).
- reftable
-
包含對(duì)比檢查數(shù)據(jù)的表的名稱(chēng).
- refcolumn
-
reftable 里要做對(duì)比檢查的字段名稱(chēng).如果沒(méi)有聲明,使用表 reftable 的 PRIMARY KEY.
- MATCH matchtype
-
有三種匹配類(lèi)型:MATCH FULL,MATCH PARTIAL 和一種缺省的匹配類(lèi)型 (如果什么都沒(méi)有聲明的話(huà)). 除非所有的外鍵字段都是 NULL, 否則 MATCH FULL 將不允許一個(gè)多列/字段外鍵的某個(gè)列為 NULL.缺省的 MATCH 類(lèi)型是允許某些外鍵字段是 NULL 而其他部分的外鍵字段不是 NULL. MATCH PARTIAL 目前不支持.
- ON DELETE action
-
當(dāng)一個(gè)被參考表里的被參考行要?jiǎng)h除時(shí),要處理的動(dòng)作.有下列動(dòng)作.
- NO ACTION
-
如果違反外鍵則產(chǎn)生錯(cuò)誤.這是缺?。?
- RESTRICT
-
與 NO ACTION 相同.
- CASCADE
-
刪除任何引用參考行的行.
- SET NULL
-
把參考列的值設(shè)為 NULL.
- SET DEFAULT
-
把參考列的值設(shè)置為它們的缺省值.
- ON UPDATE action
-
當(dāng)一個(gè)參考表里的參考列要被更新時(shí),要處理的動(dòng)作. 如果行被更新而參考列沒(méi)有改變,不發(fā)生任何動(dòng)作.有下面動(dòng)作.
- NO ACTION
-
如果違反外鍵則產(chǎn)生錯(cuò)誤.這是缺省.
- RESTRICT
-
與 NO ACTION 相同.
- CASCADE
-
把參考列的值更新為被參考列的新值.
- SET NULL
-
把參考列的值設(shè)置為 NULL.
- SET DEFAULT
-
把參考列的值設(shè)置為缺省值.
- [ NOT ] DEFERRABLE
-
這個(gè)選項(xiàng)控制該約束是否可以推遲到事務(wù)的結(jié)尾. 如果 DEFERRABLE,SET CONSTRAINTS ALL DEFERRED 將導(dǎo)致只是在事務(wù)的結(jié)束時(shí)才檢查外鍵. 缺省是 NOT DEFERRABLE.
- INITIALLY checktime
-
checktime 有兩個(gè)可能的值用以聲明檢查約束的缺省時(shí)間.
- DEFERRED
-
只在事務(wù)結(jié)尾檢查約束.
- IMMEDIATE
-
在每條語(yǔ)句(結(jié)尾)檢查約束.這是缺省.
輸入
- status
-
- ERROR: name referential integrity violation - key referenced from table not found in reftable
-
如果某人試圖把一個(gè)數(shù)值插入到一個(gè)列中, 而該列在被參考的表中沒(méi)有匹配列,則生成這條運(yùn)行時(shí)錯(cuò)誤.
表約束
[ CONSTRAINT name ] { PRIMARY KEY | UNIQUE } ( column [, ... ] ) [ CONSTRAINT name ] CHECK ( constraint ) [ CONSTRAINT name ] FOREIGN KEY ( column [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] [ [ NOT ] DEFERRABLE ] [ INITIALLY checktime ]
輸出
- constraint_name
-
完整性約束的任意名稱(chēng).
- column [, ... ]
-
用于定義唯一索引,或 PRIMARY KEY,或 NOT NULL 約束的列/字段名.
- CHECK ( constraint )
-
要作為約束進(jìn)行估值的布爾表達(dá)式.
描述
表約束是對(duì)一個(gè)基本表的一個(gè)或多個(gè)列/字段定義的完整性約束. "表約束"的四個(gè)元素是:
UNIQUE |
CHECK |
PRIMARY KEY |
FOREIGN KEY |
UNIQUE 約束
[ CONSTRAINT constraint_name ] UNIQUE ( column [, ... ] )
輸出
- status
-
- ERROR: Cannot insert a duplicate key into a unique index
-
如果試圖向列中插入一個(gè)重復(fù)的值,將發(fā)生此運(yùn)行時(shí)錯(cuò)誤.
PRIMARY KEY 約束
[ CONSTRAINT constraint_name ] PRIMARY KEY ( column [, ... ] )
REFERENCES (參考)約束
[ CONSTRAINT constraint_name ] FOREIGN KEY ( column [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] [ [ NOT ] DEFERRABLE ] [ INITIALLY checktime ]
REFERENCES (參考)約束聲明了一個(gè)規(guī)則:一個(gè)字段 或者一套字段的數(shù)值要與另外一個(gè)表的 數(shù)值做對(duì)比檢查.
輸入
- constraint_name
-
約束的任意名稱(chēng).
- column [, ... ]
-
表中的一個(gè)或者多個(gè)列的名稱(chēng).
- reftable
-
包含對(duì)比檢查數(shù)據(jù)的表的名稱(chēng).
- referenced column [, ... ]
-
reftable 里要做對(duì)比檢查的一個(gè)或多個(gè)字段的名稱(chēng). 如果沒(méi)有聲明,使用表 reftable 的 PRIMARY KEY.
- MATCH matchtype
-
有三種匹配類(lèi)型:MATCH FULL,MATCH PARTIAL 和一種缺省的匹配類(lèi)型 (如果什么都沒(méi)有聲明的話(huà)).除 非所有的外鍵字段都是 NULL,否則 MATCH FULL 將不允許一個(gè)多列/字段 外鍵的某個(gè)列為 NULL.缺省的 MATCH 類(lèi)型是允許某些外鍵字段是 NULL 而其他部分的外鍵字段不是 NULL.MATCH PARTIAL 目前不支持.
- ON DELETE action
-
當(dāng)一個(gè)被參考表里的被參考行要被刪除時(shí),要處理的動(dòng)作.有下列動(dòng)作.
- NO ACTION
-
如果違反外鍵則產(chǎn)生錯(cuò)誤.這是缺?。?
- RESTRICT
-
與 NO ACTION 相同.
- CASCADE
-
刪除任何引用參考行的行.
- SET NULL
-
把參考列的值設(shè)為 NULL.
- SET DEFAULT
-
把參考列的值設(shè)置為它們的缺省值.
- ON UPDATE action
-
當(dāng)一個(gè)被參考表里的被參考列要更新為新數(shù)值時(shí),要處理的動(dòng)作. 如果行被更新而參考列沒(méi)有改變,不發(fā)生任何動(dòng)作.有下面動(dòng)作.
- NO ACTION
-
如果違反外鍵則產(chǎn)生錯(cuò)誤.這是缺?。?
- RESTRICT
-
不允許被參考的列的更新.
- CASCADE
-
把參考列的值更新為被參考列的新值.
- SET NULL
-
把參考列的值設(shè)置為 NULL.
- SET DEFAULT
-
把參考列的值設(shè)置為缺省值.
- [ NOT ] DEFERRABLE
-
這個(gè)選項(xiàng)控制該約束是否可以推遲到事務(wù)的結(jié)尾. 如果 DEFERRABLE,SET CONSTRAINTS ALL DEFERRED 將導(dǎo)致只是在事務(wù)的結(jié)束時(shí)才檢查外鍵.缺省是NOT DEFERRABLE.
- INITIALLY checktime
-
checktime 有兩個(gè)可能的值用以聲明檢查約束的缺省時(shí)間.
- IMMEDIATE
-
在每條語(yǔ)句(結(jié)尾)檢查約束.這是缺省.
- DEFERRED
-
只在事務(wù)結(jié)尾檢查約束.
用法
創(chuàng)建表 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(3) PRIMARY KEY DEFAULT NEXTVAL('serial'), name VARCHAR(40) NOT NULL CHECK (name <> '') );
創(chuàng)建一個(gè)有2維數(shù)組的表:
CREATE TABLE array ( vector INT[][] );
給 films 表定義一個(gè) UNIQUE 表約束. UNIQUE 可以定義在表的一個(gè)或多個(gè)列/字段上:
CREATE TABLE films ( code CHAR(5), title VARCHAR(40), did DECIMAL(3), date_prod DATE, kind CHAR(10), len INTERVAL HOUR TO MINUTE, CONSTRAINT production UNIQUE(date_prod) );
定義一個(gè) CHECK 列約束:
CREATE TABLE distributors ( did DECIMAL(3) CHECK (did > 100), name VARCHAR(40) );
定義一個(gè) CHECK 表約束:
CREATE TABLE distributors ( did DECIMAL(3), name VARCHAR(40) CONSTRAINT con1 CHECK (did > 100 AND name > '') );
為表 films 定義一個(gè) PRIMARY KEY 表約束. PRIMARY KEY 表約束可以對(duì)一個(gè)或多個(gè)列/字段進(jìn)行定義:
CREATE TABLE films ( code CHAR(5), title VARCHAR(40), did DECIMAL(3), date_prod DATE, kind CHAR(10), len INTERVAL HOUR TO MINUTE, CONSTRAINT code_title PRIMARY KEY(code,title) );
為表 distributors 定義一個(gè) PRIMARY KEY 列約束. PRIMARY KEY 列約束只能對(duì)表中的一個(gè)列/字段定義.( 下面兩個(gè) 例子是相當(dāng)?shù)?):
CREATE TABLE distributors ( did DECIMAL(3), name CHAR VARYING(40), PRIMARY KEY(did) );
CREATE TABLE distributors ( did DECIMAL(3) PRIMARY KEY, name VARCHAR(40) );
兼容性
SQL92
除了本地可見(jiàn)的臨時(shí)表外,SQL92還定義了一條 CREATE GLOBAL TEMPORARY TABLE 語(yǔ)句,和一個(gè)可選的 ON COMMIT 子句:
CREATE GLOBAL TEMPORARY TABLE table ( columntype [ DEFAULT value ] [ CONSTRAINT column_constraint ] [, ... ] ) [ CONSTRAINT table_constraint ] [ ON COMMIT { DELETE | PRESERVE } ROWS ]
相對(duì)于臨時(shí)表,CREATE GLOBAL TEMPORARY TABLE 語(yǔ)句定義一個(gè)其他客戶(hù)端可見(jiàn)的新表和定義表的列/字段和約束。
CREATE TEMPORARY TABLE 可選的 ON COMMIT 子句用于聲明當(dāng) COMMIT 事務(wù)時(shí), 是否需要將臨時(shí)表的行清空. 如果省略了 ON COMMIT 子句, SQL92 就假設(shè)缺省為 ON COMMIT DELETE ROWS (當(dāng)COMMIT時(shí)清空), 不過(guò),Postgres 的行為總是象 ON COMMIT PRESERVE ROWS.
UNIQUE 子句
SQL92 對(duì) UNIQUE 定義了一些附加的功能.
表約束定義:
[ CONSTRAINT constraint_name ] UNIQUE ( column [, ... ] ) [ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ] [ [ NOT ] DEFERRABLE ]
列/字段約束定義:
[ CONSTRAINT constraint_name ] UNIQUE [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
NULL 子句
NULL "約束" (實(shí)際上不是一個(gè)約束)是一個(gè) Postgres 對(duì)SQL92的擴(kuò)展,把它包含進(jìn)來(lái)是為了和 NOT NULL 子句對(duì)稱(chēng)。 因?yàn)檫@是任何列的缺省,它的出現(xiàn)只是添亂。
[ CONSTRAINT constraint_name ] NULL
NOT NULL 子句
SQL92 對(duì) NOT NULL 聲明了一些附加的功能:
[ CONSTRAINT constraint_name ] NOT NULL [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
CONSTRAINT 子句
SQL92 對(duì)約束聲明了一些附加的功能,并且還定義了斷言和域(domain)約束.
Note: Postgres 還不支持域(domain)和斷言.
一個(gè)斷言是一種特殊類(lèi)型的完整性約束, 并且和其他約束共享相同的名字空間(namespace). 不過(guò),一個(gè)斷言不象約束那樣必須依賴(lài)于某個(gè)基本表, 所以 SQL-92 提供了一個(gè) CREATE ASSERTION 語(yǔ)句作為定義約束的一個(gè)可選的手段:
CREATE ASSERTION name CHECK ( condition )
域約束是用 CREATE DOMAIN 或 ALTER DOMAIN 語(yǔ)句定義的:
域約束:
[ CONSTRAINT constraint_name ] CHECK constraint [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
表約束定義:
[ CONSTRAINT constraint_name ] { PRIMARY KEY ( column, ... ) | FOREIGN KEY constraint | UNIQUE constraint | CHECK constraint } [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
列約束定義:
[ CONSTRAINT constraint_name ] { NOT NULL | PRIMARY KEY | FOREIGN KEY constraint | UNIQUE | CHECK constraint } [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
一個(gè) CONSTRAINT (約束)定義可以包含一個(gè) 任意順序的延遲屬性的子句和/或一個(gè)初始化約束式子句.
- NOT DEFERRABLE
-
意味著每條語(yǔ)句執(zhí)行后都必須校驗(yàn)是否違反約束規(guī)則. SET CONSTRAINTS ALL DEFERRED 對(duì)這類(lèi)約束沒(méi)有影響.
- DEFERRABLE
-
這個(gè)選項(xiàng)控制約束是否可以被推遲到事務(wù)的結(jié)束. 如果使用了 SET CONSTRAINTS ALL DEFERRED 或者約束被 設(shè)置成為 INITIALLY DEFERRED,將導(dǎo)致外鍵只在事務(wù)結(jié)束的時(shí)候檢查.
注意: SET CONSTRAINT 只為當(dāng)前事務(wù)改變外鍵約束模式.
- INITIALLY IMMEDIATE
-
在每條語(yǔ)句后檢查約束.這是缺?。?
- INITIALLY DEFERRED
-
只在事務(wù)結(jié)束的時(shí)候檢查約束.
CHECK 子句
SQL92 對(duì) CHECK 聲明了一些附加功能,不管是表約束還是列/字段約束.
表約束定義:
[ CONSTRAINT constraint_name ] CHECK ( VALUE condition ) [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
列約束定義:
[ CONSTRAINT constraint_name ] CHECK ( VALUE condition ) [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
PRIMARY KEY 子句
SQL92 為 PRIMARY KEY 聲明了一些附加的功能:
表約束定義:
[ CONSTRAINT constraint_name ] PRIMARY KEY ( column [, ... ] ) [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
列約束定義:
[ CONSTRAINT constraint_name ] PRIMARY KEY [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
|----------------------------------------------------------------------------------------|
版權(quán)聲明 版權(quán)所有 @zhyiwww
引用請(qǐng)注明來(lái)源 http://www.aygfsteel.com/zhyiwww
|----------------------------------------------------------------------------------------|