<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    zhyiwww
    用平實的筆,記錄編程路上的點點滴滴………
    posts - 536,comments - 394,trackbacks - 0

    CREATE TABLE

    Name

    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

    如果聲明了這個參數,那么 此表只是為這次會話創建,并且在會話結束后自動刪除。 當臨時表存在時,同名的永久表(在本次會話中)是不可見的。 任何在臨時表上創建的索引也自動的是臨時的.

    table_name

    將要創建的新表的名稱.

    column_name

    在這個新表中要創建的列/字段名.

    type

    列/字段類型.這里可以包括數組的聲明.請參考 PostgreSQL 用戶手冊 獲取關于數據類型和數組的詳細信息.

    inherited_table

    可選的 INHERITS 子句聲明一個表名字列表,而這個表從這些表中 自動繼承所有字段.如果有任何繼承過來的字段名字出現次數多于一次, 那么 Postgres 報告一個錯誤. Postgres 自動地允許所創建的表繼承所有其祖先表的函數.

    constraint_name

    一個字段或表約束的可選的名字.如果沒有聲明,系統生成一個.

    value

    一個列/字段的缺省值.請參考 DEFAULT 子句獲取更多信息.

    condition

    CHECK 子句聲明完整性約束或者檢查一些新行或更新行在插入和更新操作時 要想成功必須滿足的條件.每個約束都必須是一個生成一個布爾變量的表達式. 一個在某字段里出現的條件應該只引用該字段的數值,而一個作為表約束 出現的條件可以引用多個字段.

    table

    被一個外鍵約束引用的現存表的名字.

    column

    被一個外鍵約束引用的現存的表的字段名字.如果沒有聲明,則假設是 該表的主鍵.

    action

    一個關鍵字,聲明在違反外鍵約束的時候要執行的動作.

    輸出

    CREATE

    成功創建表后的返回信息.

    ERROR

    如果創建表失敗,返回此信息.通常還跟隨一些描述文本,例如: ERROR: Relation 'table' already exists 在運行時出現,因為所聲明的表已經在數據庫中存在.

    描述

    CREATE TABLE 將向當前數據庫中追加一個表. 表將為執行命令者"所有".

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

    注意: 一個屬性內的數組維數的一致性不是強制的。這一點在以后的版本中可能將改變。

    CREATE TABLE 還自動創建一個代表元組類型(結構類型) 的數據類型,該類型對應該表的一行.因此,表不能和任何現存數據類型同名.

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

    新表將作為一個沒有初始值的堆創建.一個表可以有不超過1600 (實際上,因為受字段大小限制,實際的上限還要低)列, 一個表不能和系統表同名.

    DEFAULT 子句

    DEFAULT value

    DEFAULT 子句向某字段賦一個初始值,該字段就是這個定義出現的字段. 其值可以是任意生成變量的表達式. (請注意還不支持子查詢和對本表其它字段的交叉引用). 缺省值的類型必須和列/字段定義的數據類型.

    如果在 INSERT 操作中沒有聲明該字段的數值, 那么將使用 DEFAULT 表達式的值. 如果沒有 DEFAULT 子句,則缺省是 NULL.

    用法

    CREATE TABLE distributors (
        name     VARCHAR(40) DEFAULT 'luso films',
        did      INTEGER  DEFAULT NEXTVAL('distributors_serial'),
        modtime  TIMESTAMP DEFAULT now()
    );
        
    上面的東西給字段 name 賦與了一個文本常量缺省值, 并且給字段 did 安排了一個缺省值,該值是從一個序列 對象中選出的下一個值得出的.modtime 的缺省值將是 該行插入的時間.

    有一點值得我們指出的是

        modtime  TIMESTAMP DEFAULT 'now'
        
    生成的結果可能不是我們想要的:字串 'now' 將被立即轉換成一個 timestamp 值,因此 modtime 的缺省值將總是表創建的時間.我們可以通過把缺省值聲明為一個函數 調用來避免這種困難.

    列/字段 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

    賦予整個約束的任意名稱.

    NULL

    列允許包含 NULL 值。這是缺省值。

    NOT NULL

    列不允許包含 NULL 值.與包含 CHECK 的列/字段相同 CHECK (column NOT NULL).

    UNIQUE

    列/字段必須有一個唯一值.在 Postgres 這是通過在表上隱含地創建一個唯一索引實現的.

    PRIMARY KEY

    本列是一個主鍵, 暗示著其唯一性是由系統強制提供的而且其他表可能依賴此列/字段作為 唯一的行標識. PRIMARY KEY 蘊涵 UNIQUE 和 NOT NULL 約束. 請參考 PRIMARY KEY 獲取更多的信息.

    condition

    任意布爾值約束條件.

    描述

    可選的約束子句聲明某種約束或者測試,當進行插入或者更新操作時, 新的或者更新的元組必須滿足這個約束或測試時操作才能成功。

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

    有兩種方法定義完整性約束:表約束(隨后提到), 列/字段約束(將在這里說明).

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

    PRIMARY KEY
    REFERENCES
    UNIQUE
    CHECK
    NOT NULL

    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 constraint_name ] UNIQUE
       

    輸入

    constraint_name

    賦予一個約束子句的任意名字.

    Outputs

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

    用法

    為表 name 字段 定義一個 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

    賦予約束的任意名稱.

    condition

    任何產生一個布爾值的有效的條件表達式.

    輸出

    status

    ERROR: ExecAppend: rejected due to CHECK constraint "constraint_name".

    此錯誤發生在運行時, 如果試圖向列/字段中插入一個違反 CHECK 約束的非法數值.

    描述

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

    CHECK 聲明一個涉及到一個表中一個或多個字段的一般的布爾表達失. 如果給某行的這些字段提供的數值經這個表達式計算出 FALSE,那么 該新行將被拒絕.

    目前,CHECK 表達式不能包含子查詢,也不能引用除了當前行里的字段之外的 其它變量.

    SQL92 CHECK 列約束只能對表中的一列/字段進行定義或使用. Postgres 沒有這個限制. 它把列約束和表約束一視同仁.

    PRIMARY KEY (主鍵)約束

    [ CONSTRAINT 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 并沒有明文禁止這些.

    REFERENCES 約束

    [ CONSTRAINT constraint_name ] REFERENCES reftable [ ( refcolumn ) ] 
        [ MATCH matchtype ]
        [ ON DELETE action ] 
        [ ON UPDATE action ]
        [ [ NOT ] DEFERRABLE ] 
        [ INITIALLY checktime ]
       

    REFERENCES (參考)約束聲明了一個規則: 一個字段的數值要與另外一個字段的數值做對比檢查. REFERENCES 還 可以做為一個 FOREIGN KEY 表約束的一部分聲明.

    輸入

    constraint_name

    約束的任意名稱.

    reftable

    包含對比檢查數據的表的名稱.

    refcolumn

    reftable 里要做對比檢查的字段名稱.如果沒有聲明,使用表 reftable 的 PRIMARY KEY.

    MATCH matchtype

    有三種匹配類型:MATCH FULL,MATCH PARTIAL 和一種缺省的匹配類型 (如果什么都沒有聲明的話). 除非所有的外鍵字段都是 NULL, 否則 MATCH FULL 將不允許一個多列/字段外鍵的某個列為 NULL.缺省的 MATCH 類型是允許某些外鍵字段是 NULL 而其他部分的外鍵字段不是 NULL. MATCH PARTIAL 目前不支持.

    ON DELETE action

    當一個被參考表里的被參考行要刪除時,要處理的動作.有下列動作.

    NO ACTION

    如果違反外鍵則產生錯誤.這是缺省.

    RESTRICT

    與 NO ACTION 相同.

    CASCADE

    刪除任何引用參考行的行.

    SET NULL

    把參考列的值設為 NULL.

    SET DEFAULT

    把參考列的值設置為它們的缺省值.

    ON UPDATE action

    當一個參考表里的參考列要被更新時,要處理的動作. 如果行被更新而參考列沒有改變,不發生任何動作.有下面動作.

    NO ACTION

    如果違反外鍵則產生錯誤.這是缺省.

    RESTRICT

    與 NO ACTION 相同.

    CASCADE

    把參考列的值更新為被參考列的新值.

    SET NULL

    把參考列的值設置為 NULL.

    SET DEFAULT

    把參考列的值設置為缺省值.

    [ NOT ] DEFERRABLE

    這個選項控制該約束是否可以推遲到事務的結尾. 如果 DEFERRABLE,SET CONSTRAINTS ALL DEFERRED 將導致只是在事務的結束時才檢查外鍵. 缺省是 NOT DEFERRABLE.

    INITIALLY checktime

    checktime 有兩個可能的值用以聲明檢查約束的缺省時間.

    DEFERRED

    只在事務結尾檢查約束.

    IMMEDIATE

    在每條語句(結尾)檢查約束.這是缺省.

    輸入

    status

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

    如果某人試圖把一個數值插入到一個列中, 而該列在被參考的表中沒有匹配列,則生成這條運行時錯誤.

    描述

    REFERENCE 列約束指明一個表的某列必須只能包含匹配一個 被參考表的某參考列的數據的數值.

    向這個列追加的數值使用給出的匹配類型與被參考表的參考列進行匹配. 另外,當被參考列的數據被修改,則對該列的匹配數據進行操作動作.

    注意

    目前 Postgres 只支持 MATCH FULL 和一個缺省的匹配類型. 另外,被參考表里的被參考列應該是一個有 UNIQUE 約束 的列,不過 Postgres 并沒有強制這一點.

    表約束

    [ 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

    完整性約束的任意名稱.

    column [, ... ]

    用于定義唯一索引,或 PRIMARY KEY,或 NOT NULL 約束的列/字段名.

    CHECK ( constraint )

    要作為約束進行估值的布爾表達式.

    輸出

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

    描述

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

    UNIQUE
    CHECK
    PRIMARY KEY
    FOREIGN KEY

    UNIQUE 約束

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

    輸入

    constraint_name

    賦予約束的任意名稱.

    column

    某表中的列/字段名.

    輸出

    status

    ERROR: Cannot insert a duplicate key into a unique index

    如果試圖向列中插入一個重復的值,將發生此運行時錯誤.

    描述

    UNIQUE 約束表明這樣一條規則: 表中由一個或若干個獨立的列/字段組成的集合只能包含唯一的數值. 表的 UNIQUE 約束和對應的列/字段約束的行為是一樣的, 區別是表約束可以跨越多個列/字段.

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

    用法

    避免表 distributors 中的重復行:

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

    PRIMARY KEY 約束

    [ CONSTRAINT 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 列/字段約束部分獲取更多信息.

    REFERENCES (參考)約束

    [ CONSTRAINT constraint_name ] FOREIGN KEY ( column [, ... ] )
        REFERENCES reftable [ ( refcolumn [, ... ] ) ] 
        [ MATCH matchtype ]
        [ ON DELETE action ] 
        [ ON UPDATE action ]
        [ [ NOT ] DEFERRABLE ]
        [ INITIALLY checktime ]
       

    REFERENCES (參考)約束聲明了一個規則:一個字段 或者一套字段的數值要與另外一個表的 數值做對比檢查.

    輸入

    constraint_name

    約束的任意名稱.

    column [, ... ]

    表中的一個或者多個列的名稱.

    reftable

    包含對比檢查數據的表的名稱.

    referenced column [, ... ]

    reftable 里要做對比檢查的一個或多個字段的名稱. 如果沒有聲明,使用表 reftable 的 PRIMARY KEY.

    MATCH matchtype

    有三種匹配類型:MATCH FULL,MATCH PARTIAL 和一種缺省的匹配類型 (如果什么都沒有聲明的話).除 非所有的外鍵字段都是 NULL,否則 MATCH FULL 將不允許一個多列/字段 外鍵的某個列為 NULL.缺省的 MATCH 類型是允許某些外鍵字段是 NULL 而其他部分的外鍵字段不是 NULL.MATCH PARTIAL 目前不支持.

    ON DELETE action

    當一個被參考表里的被參考行要被刪除時,要處理的動作.有下列動作.

    NO ACTION

    如果違反外鍵則產生錯誤.這是缺省.

    RESTRICT

    與 NO ACTION 相同.

    CASCADE

    刪除任何引用參考行的行.

    SET NULL

    把參考列的值設為 NULL.

    SET DEFAULT

    把參考列的值設置為它們的缺省值.

    ON UPDATE action

    當一個被參考表里的被參考列要更新為新數值時,要處理的動作. 如果行被更新而參考列沒有改變,不發生任何動作.有下面動作.

    NO ACTION

    如果違反外鍵則產生錯誤.這是缺省.

    RESTRICT

    不允許被參考的列的更新.

    CASCADE

    把參考列的值更新為被參考列的新值.

    SET NULL

    把參考列的值設置為 NULL.

    SET DEFAULT

    把參考列的值設置為缺省值.

    [ NOT ] DEFERRABLE

    這個選項控制該約束是否可以推遲到事務的結尾. 如果 DEFERRABLE,SET CONSTRAINTS ALL DEFERRED 將導致只是在事務的結束時才檢查外鍵.缺省是NOT DEFERRABLE.

    INITIALLY checktime

    checktime 有兩個可能的值用以聲明檢查約束的缺省時間.

    IMMEDIATE

    在每條語句(結尾)檢查約束.這是缺省.

    DEFERRED

    只在事務結尾檢查約束.

    輸出

    status

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

    如果某人試圖把一個數值插入到一個列中, 而該列在被參考的表中沒有匹配列,則生成這條運行時錯誤.

    描述

    FOREIGN KEY 約束聲明一個規則: 某表的一個或多個獨立列的組與被參考表中的一組獨立列相關.

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

    參考關于 FOREIGN 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(3) 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(3),
        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(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 定義一個 PRIMARY KEY 列約束. PRIMARY KEY 列約束只能對表中的一個列/字段定義.( 下面兩個 例子是相當的 ):

    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

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

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

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

    CREATE TEMPORARY TABLE 可選的 ON COMMIT 子句用于聲明當 COMMIT 事務時, 是否需要將臨時表的行清空. 如果省略了 ON COMMIT 子句, SQL92 就假設缺省為 ON COMMIT DELETE ROWS (當COMMIT時清空), 不過,Postgres 的行為總是象 ON COMMIT PRESERVE ROWS.

    UNIQUE 子句

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

    表約束定義:

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

    列/字段約束定義:

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

    NULL 子句

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

    [ CONSTRAINT constraint_name ] NULL 
         

    NOT NULL 子句

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

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

    CONSTRAINT 子句

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

    Note: Postgres 還不支持域(domain)和斷言.

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

    CREATE ASSERTION name CHECK ( condition )
        

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

    域約束:

    [ 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 ]
         

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

    NOT DEFERRABLE

    意味著每條語句執行后都必須校驗是否違反約束規則. SET CONSTRAINTS ALL DEFERRED 對這類約束沒有影響.

    DEFERRABLE

    這個選項控制約束是否可以被推遲到事務的結束. 如果使用了 SET CONSTRAINTS ALL DEFERRED 或者約束被 設置成為 INITIALLY DEFERRED,將導致外鍵只在事務結束的時候檢查.

    注意: SET CONSTRAINT 只為當前事務改變外鍵約束模式.

    INITIALLY IMMEDIATE

    在每條語句后檢查約束.這是缺省.

    INITIALLY DEFERRED

    只在事務結束的時候檢查約束.

    CHECK 子句

    SQL92 對 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 ]
         

    繼承

    通過 INHERITS 子句進行多重繼承是一個 Postgres 語言擴展.SQL99(但不是 SQL92)使用了一個不同的語法和不同的語義 定義了單繼承.SQL99 風格的繼承還不被 Postgres 支持.



    |----------------------------------------------------------------------------------------|
                               版權聲明  版權所有 @zhyiwww
                引用請注明來源 http://www.tkk7.com/zhyiwww   
    |----------------------------------------------------------------------------------------|
    posted on 2006-06-02 18:44 zhyiwww 閱讀(1498) 評論(1)  編輯  收藏 所屬分類: database

    FeedBack:
    # re: CREATE TABLE
    2006-07-21 11:09 | ellen
    幫我們解決了問題,謝謝!  回復  更多評論
      
    主站蜘蛛池模板: 无码精品人妻一区二区三区免费| 亚洲制服丝袜一区二区三区| 免费无码一区二区| 精品久久洲久久久久护士免费 | 亚洲成a人片在线看| 国产精品怡红院永久免费| 亚洲男女一区二区三区| 亚洲人成免费网站| 亚洲色大成网站www永久网站| 午夜dj免费在线观看| 亚洲国产精品成人午夜在线观看 | 亚洲福利在线播放| 久久久久久久国产免费看 | 成年女人永久免费观看片| 亚洲av综合av一区二区三区| 免费大香伊蕉在人线国产| 人人公开免费超级碰碰碰视频| 国产午夜亚洲精品午夜鲁丝片| 中文字幕乱码免费看电影| 亚洲欧洲日产国码久在线观看 | 免费一区二区三区在线视频| 国产黄色一级毛片亚洲黄片大全| 中文字幕在线视频免费观看| 中文字幕亚洲综合久久2| 欧美最猛性xxxxx免费| 免费无码午夜福利片69| 亚洲国产精品自在线一区二区| 久久午夜免费视频| 人人爽人人爽人人片A免费| 日韩va亚洲va欧洲va国产| 91免费资源网站入口| 免费观看又污又黄在线观看| 亚洲国产精品无码专区| 成人浮力影院免费看| 无套内谢孕妇毛片免费看看 | 亚洲欧洲在线观看| 啦啦啦手机完整免费高清观看 | 青娱分类视频精品免费2| 国产亚洲精品美女久久久久| 亚洲日本一区二区三区| 国产国产成年年人免费看片|