zhyiwww
          用平實(shí)的筆,記錄編程路上的點(diǎn)點(diǎn)滴滴………
          posts - 536,comments - 394,trackbacks - 0

          CREATE TABLE

          Name

          CREATE TABLE — 創(chuàng)建一個(gè)新表
          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

          成功創(chuàng)建表后的返回信息.

          ERROR

          如果創(chuàng)建表失敗,返回此信息.通常還跟隨一些描述文本,例如: ERROR: Relation 'table' already exists 在運(yùn)行時(shí)出現(xiàn),因?yàn)樗暶鞯谋硪呀?jīng)在數(shù)據(jù)庫(kù)中存在.

          描述

          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è)表約束.

          輸出

          status

          ERROR: ExecAppend: Fail to add null value in not null attribute "column".

          當(dāng)試圖向一個(gè)有 NOT NULL 約束的列插入一個(gè)空值時(shí)返回此運(yùn)行時(shí)錯(cuò)誤.

          描述

          用法

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

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

          UNIQUE (唯一)約束

          [ CONSTRAINT constraint_name ] UNIQUE
             

          輸入

          constraint_name

          賦予一個(gè)約束子句的任意名字.

          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 獲取更多信息.

          用法

          為表 name 字段 定義一個(gè) UNIQUE 約束:

          CREATE TABLE distributors (
              did      DECIMAL(3),
              name     VARCHAR(40) UNIQUE
          );
            
          與下面的表約束相同:
          CREATE TABLE distributors (
              did      DECIMAL(3),
              name     VARCHAR(40),
              UNIQUE(name)
          );
               

          CHECK (檢查)約束

          [ CONSTRAINT constraint_name ] CHECK ( condition )
             

          輸入

          constraint_name

          賦予約束的任意名稱(chēng).

          condition

          任何產(chǎn)生一個(gè)布爾值的有效的條件表達(dá)式.

          輸出

          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 
             

          輸入

          constraint_name

          約束的任意名稱(chēng).

          輸出

          ERROR: Cannot insert a duplicate key into a unique index.

          當(dāng)你試圖向一個(gè)有 PRIMARY KEY 約束的列插入一個(gè)重復(fù)的數(shù)值時(shí), 將返回這個(gè)運(yùn)行時(shí)信息.

          描述

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

          一個(gè)表只能聲明一個(gè) PRIMARY KEY,不管是作為列約束還是表約束.

          注意

          Postgres 自動(dòng)創(chuàng)建一個(gè)唯一索引以 保證數(shù)據(jù)的完整性.(參閱 CREATE INDEX 語(yǔ)句)

          在同一個(gè)表中 PRIMARY KEY 約束定義的列應(yīng)該應(yīng)該和其他定義了 UNIQUE 約束的列不同名(不是同一列). 因?yàn)檫@會(huì)導(dǎo)致等價(jià)索引的重復(fù)和增加不必要的處理.然而, Postgres 并沒(méi)有明文禁止這些.

          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ò)誤.

          描述

          REFERENCE 列約束指明一個(gè)表的某列必須只能包含匹配一個(gè) 被參考表的某參考列的數(shù)據(jù)的數(shù)值.

          向這個(gè)列追加的數(shù)值使用給出的匹配類(lèi)型與被參考表的參考列進(jìn)行匹配. 另外,當(dāng)被參考列的數(shù)據(jù)被修改,則對(duì)該列的匹配數(shù)據(jù)進(jìn)行操作動(dòng)作.

          注意

          目前 Postgres 只支持 MATCH FULL 和一個(gè)缺省的匹配類(lèi)型. 另外,被參考表里的被參考列應(yīng)該是一個(gè)有 UNIQUE 約束 的列,不過(guò) Postgres 并沒(méi)有強(qiáng)制這一點(diǎn).

          表約束

          [ 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ì)應(yīng)的列/字段約束的輸出一樣.

          描述

          表約束是對(duì)一個(gè)基本表的一個(gè)或多個(gè)列/字段定義的完整性約束. "表約束"的四個(gè)元素是:

          UNIQUE
          CHECK
          PRIMARY KEY
          FOREIGN KEY

          UNIQUE 約束

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

          輸入

          constraint_name

          賦予約束的任意名稱(chēng).

          column

          某表中的列/字段名.

          輸出

          status

          ERROR: Cannot insert a duplicate key into a unique index

          如果試圖向列中插入一個(gè)重復(fù)的值,將發(fā)生此運(yùn)行時(shí)錯(cuò)誤.

          描述

          UNIQUE 約束表明這樣一條規(guī)則: 表中由一個(gè)或若干個(gè)獨(dú)立的列/字段組成的集合只能包含唯一的數(shù)值. 表的 UNIQUE 約束和對(duì)應(yīng)的列/字段約束的行為是一樣的, 區(qū)別是表約束可以跨越多個(gè)列/字段.

          請(qǐng)參考列/字段的 UNIQUE 約束獲取更多細(xì)節(jié).

          用法

          避免表 distributors 中的重復(fù)行:

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

          PRIMARY KEY 約束

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

          輸入

          constraint_name

          賦予約束的任意名稱(chēng).

          column [, ... ]

          表中的一個(gè)或者多個(gè)列.

          輸出

          status

          ERROR: Cannot insert a duplicate key into a unique index.

          如果試圖向一個(gè)有 PRIMARY KEY 約束的表中插入重復(fù)值, 返回這個(gè)運(yùn)行時(shí)錯(cuò)誤。

          描述

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

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

          請(qǐng)參考 PRIMARY KEY 列/字段約束部分獲取更多信息.

          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é)尾檢查約束.

          輸出

          status

          ERROR: name referential integrity violation - key referenced from table not found in reftable

          如果某人試圖把一個(gè)數(shù)值插入到一個(gè)列中, 而該列在被參考的表中沒(méi)有匹配列,則生成這條運(yùn)行時(shí)錯(cuò)誤.

          描述

          FOREIGN KEY 約束聲明一個(gè)規(guī)則: 某表的一個(gè)或多個(gè)獨(dú)立列的組與被參考表中的一組獨(dú)立列相關(guān).

          FOREIGN KEY 表約束與相應(yīng)的列約束相似,只是多了控制多列/字段的能力.

          參考關(guān)于 FOREIGN KEY 列約束的內(nèi)容獲取更多信息.

          用法

          創(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 ]
               

          繼承

          通過(guò) INHERITS 子句進(jìn)行多重繼承是一個(gè) Postgres 語(yǔ)言擴(kuò)展.SQL99(但不是 SQL92)使用了一個(gè)不同的語(yǔ)法和不同的語(yǔ)義 定義了單繼承.SQL99 風(fēng)格的繼承還不被 Postgres 支持.



          |----------------------------------------------------------------------------------------|
                                     版權(quán)聲明  版權(quán)所有 @zhyiwww
                      引用請(qǐng)注明來(lái)源 http://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2006-06-02 18:44 zhyiwww 閱讀(1500) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): database

          FeedBack:
          # re: CREATE TABLE
          2006-07-21 11:09 | ellen
          幫我們解決了問(wèn)題,謝謝!  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 吕梁市| 南郑县| 鄂伦春自治旗| 乐平市| 海门市| 石嘴山市| 晴隆县| 玉环县| 全南县| 兖州市| 德庆县| 房产| 枣强县| 商水县| 襄樊市| 崇义县| 金湖县| 大港区| 库伦旗| 怀柔区| 阿克陶县| 吴旗县| 察雅县| 始兴县| 凤阳县| 乌拉特前旗| 连南| 泽库县| 呈贡县| 方正县| 罗平县| 西乌珠穆沁旗| 泸水县| 太和县| 龙山县| 林周县| 乌兰县| 皮山县| 西宁市| 沁水县| 大同县|