精品国产亚洲一区二区三区,男女作爱在线观看免费网站,欧美的又大又长做禁片A片,97国产精品人妻无码久久久

  • 相關(guān)軟件
    >CREATE TABLE 創(chuàng)建者:webmaster 更新時間:2006-02-16 15:51

    創(chuàng)建新表。



    語法


    CREATE TABLE

        [ database_name.[ owner ] .| owner.] table_name

        ( { < column_definition >

            | column_name AS computed_column_expression

            | < table_constraint > ::= [ CONSTRAINT constraint_name ] }



                | [ { PRIMARY KEY | UNIQUE } [ ,...n ]

        )



    [ ON { filegroup | DEFAULT } ]

    [ TEXTIMAGE_ON { filegroup | DEFAULT } ]



    < column_definition > ::= { column_name data_type }


        [ COLLATE < collation_name > ]

        [ [ DEFAULT constant_expression ]

            | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]

        ]

        [ ROWGUIDCOL]


        [ < column_constraint > ] [ ...n ]



    < column_constraint > ::= [ CONSTRAINT constraint_name ]


        { [ NULL | NOT NULL ]

            | [ { PRIMARY KEY | UNIQUE }

                [ CLUSTERED | NONCLUSTERED ]

                [ WITH FILLFACTOR = fillfactor ]

                [ON {filegroup | DEFAULT} ] ]

            ]

            | [ [ FOREIGN KEY ]


                REFERENCES ref_table [ ( ref_column ) ]

                [ ON DELETE { CASCADE | NO ACTION } ]

                [ ON UPDATE { CASCADE | NO ACTION } ]

                [ NOT FOR REPLICATION ]

            ]

            | CHECK [ NOT FOR REPLICATION ]


            ( logical_expression )

        }



    < table_constraint > ::= [ CONSTRAINT constraint_name ]

        { [ { PRIMARY KEY | UNIQUE }

            [ CLUSTERED | NONCLUSTERED ]

            { ( column [ ASC | DESC ] [ ,...n ] ) }

            [ WITH FILLFACTOR = fillfactor ]

            [ ON { filegroup | DEFAULT } ]

        ]

        | FOREIGN KEY


            [ ( column [ ,...n ] ) ]

            REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]

            [ ON DELETE { CASCADE | NO ACTION } ]

            [ ON UPDATE { CASCADE | NO ACTION } ]

            [ NOT FOR REPLICATION ]

        | CHECK [ NOT FOR REPLICATION ]

            ( search_conditions )

        }



    參數(shù)


    database_name



    是要在其中創(chuàng)建表的數(shù)據(jù)庫名稱。database_name 必須是現(xiàn)有數(shù)據(jù)庫的名稱。如果不指定數(shù)據(jù)庫,database_name 默認(rèn)為當(dāng)前數(shù)據(jù)庫。當(dāng)前連接的登錄必須在 database_name 所指定的數(shù)據(jù)庫中有關(guān)聯(lián)的現(xiàn)有用戶 ID,而該用戶 ID 必須具有創(chuàng)建表的權(quán)限。



    owner



    是新表所有者的用戶 ID 名,owner 必須是 database_name 所指定的數(shù)據(jù)庫中的現(xiàn)有用戶 ID,owner 默認(rèn)為與 database_name 所指定的數(shù)據(jù)庫中的當(dāng)前連接相關(guān)聯(lián)的用戶 ID。如果 CREATE TABLE 語句由 sysadmin 固定服務(wù)器角色成員或 database_name 所指定的數(shù)據(jù)庫中的 db_dbownerdb_ddladmin 固定數(shù)據(jù)庫角色成員執(zhí)行,則 owner 可以指定與當(dāng)前連接的登錄相關(guān)聯(lián)的用戶 ID 以外的其它用戶 ID。如果與執(zhí)行 CREATE TABLE 語句的登錄相關(guān)聯(lián)的用戶 ID 僅具有創(chuàng)建表的權(quán)限,則 owner 必須指定與當(dāng)前登錄相關(guān)聯(lián)的用戶 ID。sysadmin 固定服務(wù)器角色成員或別名為 dbo 用戶的登錄與用戶 ID dbo 相關(guān)聯(lián);因此,由這些用戶創(chuàng)建的表的默認(rèn)所有者為 dbo。不是由上述兩種角色的登錄創(chuàng)建的表所有者默認(rèn)為與該登錄相關(guān)聯(lián)的用戶 ID。



    table_name



    是新表的名稱。表名必須符合標(biāo)識符規(guī)則。數(shù)據(jù)庫中的 owner.table_name 組合必須唯一。table_name 最多可包含 128 個字符,但本地臨時表的表名(名稱前有一個編號符 #)最多只能包含 116 個字符。



    column_name



    是表中的列名。列名必須符合標(biāo)識符規(guī)則,并且在表內(nèi)唯一。以 timestamp 數(shù)據(jù)類型創(chuàng)建的列可以省略 column_name。如果不指定 column_name,timestamp 列的名稱默認(rèn)為 timestamp。



    computed_column_expression



    是定義計(jì)算列值的表達(dá)式。計(jì)算列是物理上并不存儲在表中的虛擬列。計(jì)算列由同一表中的其它列通過表達(dá)式計(jì)算得到。例如,計(jì)算列可以這樣定義:cost AS price * qty。表達(dá)式可以是非計(jì)算列的列名、常量、函數(shù)、變量,也可以是用一個或多個運(yùn)算符連接的上述元素的任意組合。表達(dá)式不能為子查詢。



    計(jì)算列可用于選擇列表、WHERE 子句、ORDER BY 子句或任何其它可使用常規(guī)表達(dá)式的位置,但下列情況除外:


    • 計(jì)算列不能用作 DEFAULT 或 FOREIGN KEY 約束定義,也不能與 NOT NULL 約束定義一起使用。但是,如果計(jì)算列由具有確定性的表達(dá)式定義,并且索引列中允許計(jì)算結(jié)果的數(shù)據(jù)類型,則可將該列用作索引中的鍵列,或用作 PRIMARY KEY 或 UNIQUE 約束的一部分。

      例如,如果表中含有整型列 ab,則可以在計(jì)算列 a+b 上創(chuàng)建索引。但不能在計(jì)算列 a+DATEPART(dd, GETDATE()) 上創(chuàng)建索引,因?yàn)樵谝院蟮恼{(diào)用中,其值可能發(fā)生改變。



    • 計(jì)算列不能作為 INSERT 或 UPDATE 語句的目標(biāo)。

      說明  表中計(jì)算列所使用的列值因行而異,因此每行的計(jì)算列值可能不同。



      計(jì)算列的為空性是由 SQL Server 根據(jù)使用的表達(dá)式自動確定的。即使只有不可為空的列,大多數(shù)表達(dá)式的結(jié)果也認(rèn)為是可為空的,因?yàn)榭赡艿南乱缁蛞绯鲆矊⑸?NULL 結(jié)果。使用 COLUMNPROPERTY 函數(shù)(AllowsNull 屬性)查看表中任何計(jì)算列的為空性。通過指定 ISNULL(check_expression, constant),其中常量為替代任何 NULL 結(jié)果的非 NULL 值,可為空的表達(dá)式 expr 可以轉(zhuǎn)換為不可為空的表達(dá)式。




    ON {filegroup | DEFAULT}



    指定存儲表的文件組。如果指定 filegroup,則表將存儲在指定的文件組中。數(shù)據(jù)庫中必須存在該文件組。如果指定 DEFAULT,或者根本未指定 ON 參數(shù),則表存儲在默認(rèn)文件組中。



    ON {filegroup | DEFAULT} 也可以在 PRIMARY KEY 約束或 UNIQUE 約束中指定。這些約束會創(chuàng)建索引。如果指定 filegroup,則索引將存儲在指定的文件組中。如果指定 DEFAULT,則索引將存儲在默認(rèn)文件組中。如果約束中沒有指定文件組,則索引將與表存儲在同一文件組中。如果 PRIMARY KEY 約束或 UNIQUE 約束創(chuàng)建聚集索引,則表的數(shù)據(jù)頁將與索引存儲在同一文件組中。



    說明  在 ON {filegroup | DEFAULT} 和 TEXTIMAGE_ON {filegroup | DEFAULT} 的上下文中,DEFAULT 并不是關(guān)鍵字。DEFAULT 是默認(rèn)文件組的標(biāo)識符并需對其進(jìn)行定界,如 ON "DEFAULT"、ON [DEFAULT] 和 TEXTIMAGE_ON "DEFAULT" 或 TEXTIMAGE_ON [DEFAULT]。



    TEXTIMAGE_ON



    是表示 textntextimage 列存儲在指定文件組中的關(guān)鍵字。如果表中沒有 text、ntextimage 列,則不能使用 TEXTIMAGE ON。如果沒有指定 TEXTIMAGE_ON,則 text、ntextimage 列將與表存儲在同一文件組中。



    data_type



    指定列的數(shù)據(jù)類型??梢允窍到y(tǒng)數(shù)據(jù)類型或用戶定義數(shù)據(jù)類型。用戶定義數(shù)據(jù)類型必須先用 sp_addtype 創(chuàng)建,然后才能在表定義中使用。



    在 CREATE TABLE 語句中,用戶定義數(shù)據(jù)類型的 NULL/NOT NULL 賦值可被替代。但長度標(biāo)準(zhǔn)不能更改;不能在 CREATE TABLE 語句中指定用戶定義數(shù)據(jù)類型的長度。



    DEFAULT



    如果在插入過程中未顯式提供值,則指定為列提供的值。DEFAULT 定義可適用于除定義為 timestamp 或帶 IDENTITY 屬性的列以外的任何列。除去表時,將刪除 DEFAULT 定義。只有常量值(如字符串)、系統(tǒng)函數(shù)(如 SYSTEM_USER())或 NULL 可用作默認(rèn)值。為保持與 SQL Server 早期版本的兼容,可以給 DEFAULT 指派約束名。



    constant_expression



    是用作列的默認(rèn)值的常量、NULL 或系統(tǒng)函數(shù)。



    IDENTITY



    表示新列是標(biāo)識列。當(dāng)向表中添加新行時,Microsoft® SQL Server™ 將為該標(biāo)識列提供一個唯一的、遞增的值。標(biāo)識列通常與 PRIMARY KEY 約束一起用作表的唯一行標(biāo)識符。可以將 IDENTITY 屬性指派給 tinyint、smallintint、bigint、decimal(p,0)numeric(p,0) 列。對于每個表只能創(chuàng)建一個標(biāo)識列。不能對標(biāo)識列使用綁定默認(rèn)值和 DEFAULT 約束。必須同時指定種子和增量,或者二者都不指定。如果二者都未指定,則取默認(rèn)值 (1,1)。



    seed



    是裝入表的第一行所使用的值。



    increment



    是添加到前一行的標(biāo)識值的增量值。



    NOT FOR REPLICATION



    表示當(dāng)復(fù)制登錄(如 sqlrepl)向表中插入數(shù)據(jù)時,不強(qiáng)制 IDENTITY 屬性。復(fù)制的行必須保留發(fā)布數(shù)據(jù)庫中所賦予的鍵值;NOT FOR REPLICATION 子句確保不向復(fù)制進(jìn)程所插入的行賦予新的標(biāo)識值。其它登錄所插入的行仍然具有以通常的方式創(chuàng)建的新標(biāo)識值。建議同時使用具有 NOT FOR REPLICATION 的 CHECK 約束,以確保賦予的標(biāo)識值處于當(dāng)前數(shù)據(jù)庫所需的范圍內(nèi)。



    ROWGUIDCOL



    表示新列是行的全局唯一標(biāo)識符列。對于每個表只能指派一個 uniqueidentifier 列作為 ROWGUIDCOL 列。ROWGUIDCOL 屬性只能指派給 uniqueidentifier 列。如果數(shù)據(jù)庫兼容級別小于或等于 65,則 ROWGUIDCOL 關(guān)鍵字無效。有關(guān)更多信息,請參見 sp_dbcmptlevel。



    ROWGUIDCOL 屬性并不強(qiáng)制列中所存儲值的唯一性。該屬性也不會為插入到表中的新行自動生成值。若要為每列生成唯一值,那么或者在 INSERT 語句中使用 NEWID 函數(shù),或者將 NEWID 函數(shù)指定為該列的默認(rèn)值。



    collation_name



    指定列的排序規(guī)則。排序規(guī)則名稱既可以是 Windows 排序規(guī)則名稱,也可以是 SQL 排序規(guī)則名稱。collation_name 僅適用于數(shù)據(jù)類型為 char、varchar、text、nchar、nvarcharntext 的列。如果沒有指定該參數(shù),那么如果列的數(shù)據(jù)類型是用戶定義的,則該列的排序規(guī)則就是用戶定義數(shù)據(jù)類型的排序規(guī)則,否則就是數(shù)據(jù)庫的默認(rèn)排序規(guī)則。



    有關(guān) Windows 和 SQL 排序規(guī)則名稱的更多信息,請參見 COLLATE



    CONSTRAINT



    是可選關(guān)鍵字,表示 PRIMARY KEY、NOT NULL、UNIQUE、FOREIGN KEY 或 CHECK 約束定義的開始。約束是特殊屬性,用于強(qiáng)制數(shù)據(jù)完整性并可以為表及其列創(chuàng)建索引。



    constrain_name



    是約束的名稱。約束名在數(shù)據(jù)庫內(nèi)必須是唯一的。



    NULL | NOT NULL



    是確定列中是否允許空值的關(guān)鍵字。從嚴(yán)格意義上講,NULL 不是約束,但可以使用與指定 NOT NULL 同樣的方法指定。



    PRIMARY KEY



    是通過唯一索引對給定的一列或多列強(qiáng)制實(shí)體完整性的約束。對于每個表只能創(chuàng)建一個 PRIMARY KEY 約束。



    UNIQUE



    是通過唯一索引為給定的一列或多列提供實(shí)體完整性的約束。一個表可以有多個 UNIQUE 約束。



    CLUSTERED | NONCLUSTERED



    是表示為 PRIMARY KEY 或 UNIQUE 約束創(chuàng)建聚集或非聚集索引的關(guān)鍵字。PRIMARY KEY 約束默認(rèn)為 CLUSTERED,UNIQUE 約束默認(rèn)為 NONCLUSTERED。



    在 CREATE TABLE 語句中只能為一個約束指定 CLUSTERED。如果在為 UNIQUE 約束指定 CLUSTERED 的同時又指定了 PRIMARY KEY 約束,則 PRIMARY KEY 將默認(rèn)為 NONCLUSTERED。



    [ WITH FILLFACTOR = fillfactor ]



    指定 SQL Server 存儲索引數(shù)據(jù)時每個索引頁的充滿程度。用戶指定的 fillfactor 取值范圍從 1 到 100。如果沒有指定 fillfactor,則默認(rèn)為 0。創(chuàng)建索引時,fillfactor 的值越低,不必分配新空間即可由新索引項(xiàng)使用的空間就越多。



    FOREIGN KEY...REFERENCES



    是為列中的數(shù)據(jù)提供引用完整性的約束。FOREIGN KEY 約束要求列中的每個值在被引用表中對應(yīng)的被引用列中都存在。FOREIGN KEY 約束只能引用被引用表中為 PRIMARY KEY 或 UNIQUE 約束的列或被引用表中在 UNIQUE INDEX 內(nèi)引用的列。



    ref_table



    是 FOREIGN KEY 約束所引用的表名。



    (ref_column[,...n])



    是 FOREIGN KEY 約束所引用的表中的一列或多列。



    ON DELETE {CASCADE | NO ACTION}



    指定當(dāng)要創(chuàng)建的表中的行具有引用關(guān)系,并且從父表中刪除該行所引用的行時,要對該行采取的操作。默認(rèn)設(shè)置為 NO ACTION。



    如果指定 CASCADE,則從父表中刪除被引用行時,也將從引用表中刪除引用行。如果指定 NO ACTION,SQL Server 將產(chǎn)生一個錯誤并回滾父表中的行刪除操作。



    例如,在 Northwind 數(shù)據(jù)庫中,Orders 表和 Customers 表之間有引用關(guān)系。Orders.CustomerID 外鍵引用 Customers.CustomerID 主鍵。



    如果對 Customers 表的某行執(zhí)行 DELETE 語句,并且為 Orders.CustomerID 指定 ON DELETE CASCADE 操作,則 SQL Server 將在 Orders 表中檢查是否有與被刪除的行相關(guān)的一行或多行。如果存在相關(guān)行,則 Orders 表中的相關(guān)行將隨 Customers 表中的被引用行一同刪除。



    反之,如果指定 NO ACTION,若在 Orders 表中至少有一行引用 Customers 表中要刪除的行,則 SQL Server 將產(chǎn)生一個錯誤并回滾 Customers 表中的刪除操作。



    ON UPDATE {CASCADE | NO ACTION}



    指定當(dāng)要創(chuàng)建的表中的行具有引用關(guān)系,并且在父表中更新該行所引用的行時,要對該行采取的操作。默認(rèn)設(shè)置為 NO ACTION。



    如果指定 CASCADE,則在父表中更新被引用行時,也將在引用表中更新引用行。如果指定 NO ACTION,SQL Server 將產(chǎn)生一個錯誤并回滾父表中的行更新操作。



    例如,在 Northwind 數(shù)據(jù)庫中,Orders 表和 Customers 表之間有引用關(guān)系:Orders.CustomerID 外鍵引用 Customers.CustomerID 主鍵。



    如果對 Customers 表的某行執(zhí)行 UPDATE 語句,并且為 Orders.CustomerID 指定 ON UPDATE CASCADE 操作,則 SQL Server 將在 Orders 表中檢查是否有與被更新行相關(guān)的一行或多行。如果存在相關(guān)行,則 Orders 表中的相關(guān)行將隨 Customers 表中的被引用行一同更新。



    反之,如果指定 NO ACTION,若在 Orders 表中至少有一行引用 Customers 行,則 SQL Server 將產(chǎn)生一個錯誤并回滾對 Customers 行的更新操作。



    CHECK



    是通過限制可輸入到一列或多列中的可能值強(qiáng)制域完整性的約束。



    NOT FOR REPLICATION



    是用于防止在復(fù)制所使用的分發(fā)過程中強(qiáng)制 CHECK 約束的關(guān)鍵字。當(dāng)表是復(fù)制發(fā)布的訂戶時,請不要直接更新訂閱表,而要更新發(fā)布表,然后讓復(fù)制進(jìn)程將數(shù)據(jù)分發(fā)回訂閱表。可以在訂閱表上定義 CHECK 約束,以防用戶修改訂閱表。但是如果不使用 NOT FOR REPLICATION 子句,CHECK 約束同樣會防止復(fù)制進(jìn)程將修改從發(fā)布表分發(fā)給訂閱表。NOT FOR REPLICATION 子句表示對用戶的修改(而不是對復(fù)制進(jìn)程)強(qiáng)加約束。



    NOT FOR REPLICATION CHECK 約束適用于被更新記錄的前像和后像,以防在復(fù)制范圍中添加記錄或從復(fù)制范圍中刪除記錄。將檢查所有刪除和插入操作;如果操作在復(fù)制范圍內(nèi),則拒絕執(zhí)行該操作。



    如果對標(biāo)識符列使用此約束,則當(dāng)復(fù)制用戶更新標(biāo)識列時,SQL Server 將允許不必重新計(jì)算表標(biāo)識列的種子值。



    logical_expression



    是返回 TRUE 或 FALSE 的邏輯表達(dá)式。



    column



    是用括號括起來的一列或多列,在表約束中表示這些列用在約束定義中。



    [ASC | DESC]



    指定加入到表約束中的一列或多列的排序次序。默認(rèn)設(shè)置為 ASC。



    n



    是表示前面的項(xiàng)可重復(fù) n 次的占位符。



    注釋


    SQL Server 的每個數(shù)據(jù)庫最多可存儲 20 億個表,每個表可以有 1024 列。表的行數(shù)及總大小僅受可用存儲空間的限制。每行最多可以存儲 8,060 字節(jié)。如果創(chuàng)建具有 varcharnvarcharvarbinary 列的表,并且列的字節(jié)總數(shù)超過 8,060 字節(jié),雖然仍可以創(chuàng)建此表,但會出現(xiàn)警告信息。如果試圖插入超過 8,060 字節(jié)的行或?qū)π羞M(jìn)行更新以至字節(jié)總數(shù)超過 8,060,將出現(xiàn)錯誤信息并且語句執(zhí)行失敗。



    包含 sql_variant 列的 CREATE TABLE 語句可以生成下列警告:



    The total row size (xx) for table 'yy' exceeds the maximum number of bytes per row (8060). Rows that exceed the maximum number of bytes will not be added.


    出現(xiàn)該警告是因?yàn)?sql_variant 的最大長度只能為 8016 字節(jié)。當(dāng)某個 sql_variant 列包含與最大長度接近的值時,它可以超過行的最大大小限制。



    每個表最多可以有 249 個非聚集索引和一個聚集索引。其中包括所有為支持表中所定義的 PRIMARY KEY 和 UNIQUE 約束而生成的索引。



    SQL Server 在列定義中并不強(qiáng)制以特定的順序指定 DEFAULT、IDENTITY、ROWGUIDCOL 或列約束。



    臨時表


    可以創(chuàng)建本地和全局臨時表。本地臨時表僅在當(dāng)前會話中可見;全局臨時表在所有會話中都可見。



    本地臨時表的名稱前面有一個編號符 (#table_name),而全局臨時表的名稱前面有兩個編號符 (##table_name)。



    SQL 語句使用 CREATE TABLE 語句中為 table_name 指定的名稱引用臨時表:



    CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
    INSERT INTO #MyTempTable VALUES (1)


    如果本地臨時表由存儲過程創(chuàng)建或由多個用戶同時執(zhí)行的應(yīng)用程序創(chuàng)建,則 SQL Server 必須能夠區(qū)分由不同用戶創(chuàng)建的表。為此,SQL Server 在內(nèi)部為每個本地臨時表的表名追加一個數(shù)字后綴。存儲在 tempdb 數(shù)據(jù)庫的 sysobjects 表中的臨時表,其全名由 CREATE TABLE 語句中指定的表名和系統(tǒng)生成的數(shù)字后綴組成。為了允許追加后綴,為本地臨時表指定的表名 table_name 不能超過 116 個字符。



    除非使用 DROP TABLE 語句顯式除去臨時表,否則臨時表將在退出其作用域時由系統(tǒng)自動除去:


    • 當(dāng)存儲過程完成時,將自動除去在存儲過程中創(chuàng)建的本地臨時表。由創(chuàng)建表的存儲過程執(zhí)行的所有嵌套存儲過程都可以引用此表。但調(diào)用創(chuàng)建此表的存儲過程的進(jìn)程無法引用此表。



    • 所有其它本地臨時表在當(dāng)前會話結(jié)束時自動除去。



    • 全局臨時表在創(chuàng)建此表的會話結(jié)束且其它任務(wù)停止對其引用時自動除去。任務(wù)與表之間的關(guān)聯(lián)只在單個 Transact-SQL 語句的生存周期內(nèi)保持。換言之,當(dāng)創(chuàng)建全局臨時表的會話結(jié)束時,最后一條引用此表的 Transact-SQL 語句完成后,將自動除去此表。



    在存儲過程或觸發(fā)器中創(chuàng)建的本地臨時表與在調(diào)用存儲過程或觸發(fā)器之前創(chuàng)建的同名臨時表不同。如果查詢引用臨時表,而同時有兩個同名的臨時表,則不定義針對哪個表解析該查詢。嵌套存儲過程同樣可以創(chuàng)建與調(diào)用它的存儲過程所創(chuàng)建的臨時表同名的臨時表。嵌套存儲過程中對表名的所有引用都被解釋為是針對該嵌套過程所創(chuàng)建的表,例如:



    CREATE PROCEDURE Test2
    AS
    CREATE TABLE #t(x INT PRIMARY KEY)
    INSERT INTO #t VALUES (2)
    SELECT Test2Col = x FROM #t
    GO
    CREATE PROCEDURE Test1
    AS
    CREATE TABLE #t(x INT PRIMARY KEY)
    INSERT INTO #t VALUES (1)
    SELECT Test1Col = x FROM #t
    EXEC Test2
    GO
    CREATE TABLE #t(x INT PRIMARY KEY)
    INSERT INTO #t VALUES (99)
    GO
    EXEC Test1
    GO


    下面是結(jié)果集:



    (1 row(s) affected)

    Test1Col  
    -----------
    1      

    (1 row(s) affected)

    Test2Col  
    -----------
    2      


    當(dāng)創(chuàng)建本地或全局臨時表時,CREATE TABLE 語法支持除 FOREIGN KEY 約束以外的其它所有約束定義。如果在臨時表中指定 FOREIGN KEY 約束,該語句將返回警告信息,指出此約束已被忽略,表仍會創(chuàng)建,但不具有 FOREIGN KEY 約束。在 FOREIGN KEY 約束中不能引用臨時表。



    考慮使用表變量而不使用臨時表。當(dāng)需要在臨時表上顯式地創(chuàng)建索引時,或多個存儲過程或函數(shù)需要使用表值時,臨時表很有用。通常,表變量提供更有效的查詢處理。有關(guān)更多信息,請參見 table



    PRIMARY KEY 約束



    • 一個表只能包含一個 PRIMARY KEY 約束。



    • 由 PRIMARY KEY 約束生成的索引不能使表中的非聚集索引超過 249 個,聚集索引超過 1 個。



    • 如果沒有在 PRIMARY KEY 約束中指定 CLUSTERED 或 NONCLUSTERED,并且沒有為 UNIQUE 約束指定聚集索引,則將對該 PRIMARY KEY 約束使用 CLUSTERED。



    • 在 PRIMARY KEY 約束中定義的所有列都必須定義為 NOT NULL。如果沒有指定為空性,加入 PRIMARY KEY 約束的所有列的為空性都將設(shè)置為 NOT NULL。



    UNIQUE 約束



    • 如果 UNIQUE 約束中沒有指定 CLUSTERED 或 NONCLUSTERED,則默認(rèn)為 NONCLUSTERED。



    • 每個 UNIQUE 約束都生成一個索引。由 UNIQUE 約束生成的索引不能使表中的非聚集索引超過 249 個,聚集索引超過 1 個。



    FOREIGN KEY 約束



    • 如果在 FOREIGN KEY 約束的列中輸入非 NULL 值,則此值必須在被引用的列中存在,否則將返回違反外鍵約束的錯誤信息。



    • FOREIGN KEY 約束應(yīng)用于前面所講的列,除非指定了源列。



    • FOREIGN KEY 約束僅能引用位于同一服務(wù)器上的同一數(shù)據(jù)庫中的表。數(shù)據(jù)庫間的引用完整性必須通過觸發(fā)器實(shí)現(xiàn)。有關(guān)更多信息,請參見 CREATE TRIGGER



    • FOREIGN KEY 可以引用同一表中的其它列(自引用)。



    • 列級 FOREIGN KEY 約束的 REFERENCES 子句僅能列出一個引用列,且該列必須與定義約束的列具有相同的數(shù)據(jù)類型。



    • 表級 FOREIGN KEY 約束的 REFERENCES 子句中引用列的數(shù)目必須與約束列列表中的列數(shù)相同。每個引用列的數(shù)據(jù)類型也必須與列表中相應(yīng)列的數(shù)據(jù)類型相同。



    • 如果 timestamp 類型的列是外鍵或被引用鍵的一部分,則不能指定 CASCADE。



    • 可以在相互間具有引用關(guān)系的表上組合使用 CASCADE 和 NO ACTION。如果 SQL Server 遇到 NO ACTION,將終止執(zhí)行語句并回滾相關(guān)的 CASCADE 操作。當(dāng) DELETE 語句導(dǎo)致 CASCADE 和 NO ACTION 組合操作時,在 SQL Server 檢查 NO ACTION 操作之前將執(zhí)行所有 CASCADE 操作。



    • 一個表最多可包含 253 個 FOREIGN KEY 約束。



    • 對于臨時表不強(qiáng)制 FOREIGN KEY 約束。



    • 每個表在其 FOREIGN KEY 約束中最多可以引用 253 個不同的表。



    • FOREIGN KEY 約束只能引用被引用表的 PRIMARY KEY 或 UNIQUE 約束中的列或被引用表上 UNIQUE INDEX 中的列。



    DEFAULT 定義



    • 每列只能有一個 DEFAULT 定義。



    • DEFAULT 定義可以包含常量值、函數(shù)、SQL-92 niladic 函數(shù)或 NULL。下表顯示 niladic 函數(shù)及其在執(zhí)行 INSERT 語句時返回的默認(rèn)值。































      SQL-92 niladic 函數(shù)返回的值
      CURRENT_TIMESTAMP當(dāng)前日期和時間。
      CURRENT_USER執(zhí)行插入操作的用戶名。
      SESSION_USER執(zhí)行插入操作的用戶名。
      SYSTEM_USER執(zhí)行插入操作的用戶名。
      USER執(zhí)行插入操作的用戶名。




    • DEFAULT 定義中的 constant_expression 不能引用表中的其它列,也不能引用其它表、視圖或存儲過程。



    • 不能在數(shù)據(jù)類型為 timestamp 的列或具有 IDENTITY 屬性的列上創(chuàng)建 DEFAULT 定義。



    • 如果用戶定義數(shù)據(jù)類型綁定到默認(rèn)對象,則不能在該用戶定義數(shù)據(jù)類型的列上創(chuàng)建 DEFAULT 定義。



    CHECK 約束



    • 列可以有任意多個 CHECK 約束,并且約束條件中可以包含用 AND 和 OR 組合起來的多個邏輯表達(dá)式。列上的多個 CHECK 約束按創(chuàng)建順序進(jìn)行驗(yàn)證。



    • 搜索條件必須取值為布爾表達(dá)式,并且不能引用其它表。



    • 列級 CHECK 約束只能引用被約束的列,表級 CHECK 約束只能引用同一表中的列。

      當(dāng)執(zhí)行 INSERT 和 DELETE 語句時,CHECK CONSTRAINTS 和規(guī)則具有相同的數(shù)據(jù)驗(yàn)證功能。



    • 當(dāng)列上存在規(guī)則和一個或多個 CHECK 約束時,將驗(yàn)證所有限制。



    其它約束信息



    • 為約束創(chuàng)建的索引不能用 DROP INDEX 語句除去;必須用 ALTER TABLE 語句除去約束??梢杂?DBCC DBREINDEX 語句重建為約束創(chuàng)建的并由其使用的索引。



    • 約束的名稱必須符合標(biāo)識符規(guī)則,但其名稱的首字符不能為 #。如果沒有提供 constraint_name,則使用系統(tǒng)生成的名稱。約束名將出現(xiàn)在所有與違反約束有關(guān)的錯誤信息中。



    • 當(dāng) INSERT、UPDATE 或 DELETE 語句違反約束時,將終止執(zhí)行該語句。但將繼續(xù)處理事務(wù)(如果此語句為顯式事務(wù)的組成部分)。可以通過檢查系統(tǒng)函數(shù) @@ERROR,在事務(wù)定義中使用 ROLLBACK TRANSACTION 語句。



    如果某個表具有 FOREIGN KEY 或 CHECK CONSTRAINTS 及觸發(fā)器,則將在觸發(fā)器執(zhí)行前先檢查約束條件。



    若要獲得關(guān)于表及其列的報表,請使用 sp_helpsp_helpconstraint。若要重命名表,請使用 sp_rename。若要獲得與表相關(guān)的視圖和存儲過程的報表,請使用 sp_depends。



    通常情況下,為表和索引分配空間時,每次以一個擴(kuò)展盤區(qū)為增量單位。當(dāng)創(chuàng)建表或索引時,首先從混合擴(kuò)展盤區(qū)為其分配頁,直到它具有足夠的頁填滿一個統(tǒng)一擴(kuò)展盤區(qū)。當(dāng)有足夠的頁填滿統(tǒng)一擴(kuò)展盤區(qū)后,每當(dāng)當(dāng)前分配的擴(kuò)展盤區(qū)填滿時,將再為其分配另一個擴(kuò)展盤區(qū)。若要獲得關(guān)于由表分配和占用的空間量的報表,請執(zhí)行 sp_spaceused。



    表定義中的為空性規(guī)則


    列的為空性規(guī)則決定該列中是否允許以空值 (NULL) 作為其數(shù)據(jù)。NULL 不是零或空白:它表示沒有輸入任何內(nèi)容,或提供了一個顯式 NULL 值,通常表示該值未知或不適用。



    當(dāng)用 CREATE TABLE 或 ALTER TABLE 語句創(chuàng)建或更改表時,數(shù)據(jù)庫或會話設(shè)置會影響且可能替代列定義中數(shù)據(jù)類型的為空性。建議始終將列顯式定義為非計(jì)算列的 NULL 或 NOT NULL,如果使用用戶定義數(shù)據(jù)類型,則建議允許該列使用此數(shù)據(jù)類型的默認(rèn)為空性。



    在沒有顯式指定時,列的為空性遵循以下規(guī)則:


    • 如果該列以用戶定義數(shù)據(jù)類型定義:

      • SQL Server 使用在創(chuàng)建數(shù)據(jù)類型時指定的為空性。使用 sp_help 可獲得該數(shù)據(jù)類型的默認(rèn)為空性。




    • 如果該列以系統(tǒng)提供的數(shù)據(jù)類型定義:

      • 如果系統(tǒng)提供的數(shù)據(jù)類型只有一個選項(xiàng),則優(yōu)先使用該選項(xiàng)。timestamp 數(shù)據(jù)類型只能定義為 NOT NULL。



      • 如果 sp_dbcmptlevel 的設(shè)置是 65 或更小,且列沒有顯式定義 NULL 或 NOT NULL,則 bit 數(shù)據(jù)類型默認(rèn)為 NOT NULL。有關(guān)更多信息,請參見 sp_dbcmptlevel。



      • 如果有任何會話設(shè)置為 ON(用 SET 語句打開),那么:

        如果 ANSI_NULL_DFLT_ON 是 ON,則指派 NULL。


        如果 ANSI_NULL_DFLT_OFF 是 ON,則指派 NOT NULL。



      • 如果配置了任何數(shù)據(jù)庫設(shè)置(用 sp_dboption 更改),那么:

        如果 ANSI null defaulttrue,則指派 NULL。


        如果 ANSI null defaultfalse,則指派 NOT NULL。





    • 當(dāng)會話的兩個 ANSI_NULL_DFLT 選項(xiàng)都未設(shè)置,且數(shù)據(jù)庫設(shè)置為默認(rèn)值(ANSI null defaultfalse)時,將指派 SQL Server 的默認(rèn)設(shè)置 NOT NULL。



    • 如果該列是計(jì)算列,則其為空性總是由 SQL Server 自動確定。使用 COLUMNPROPERTY 函數(shù)(AllowsNull 屬性)查找這類列的為空性。



    說明  默認(rèn)情況下,SQL Server ODBC 驅(qū)動程序和用于 SQL Server 的 Microsoft OLE DB 提供程序都將 ANSI_NULL_DFLT_ON 設(shè)置為 ON。ODBC 和 OLE DB 用戶可以在 ODBC 數(shù)據(jù)源中配置該設(shè)置,或通過應(yīng)用程序設(shè)置的連接特性或?qū)傩耘渲迷撛O(shè)置。



    權(quán)限


    CREATE TABLE 權(quán)限默認(rèn)授予 db_owner db_ddladmin 固定數(shù)據(jù)庫角色成員。db_owner 固定數(shù)據(jù)庫角色成員和 sysadmin 固定服務(wù)器角色成員可以將 CREATE TABLE 權(quán)限轉(zhuǎn)讓給其他用戶。



    示例


    A. 使用 PRIMARY KEY 約束


    下例顯示在示例數(shù)據(jù)庫 pubsjobs 表中,job_id 列中具有聚集索引的 PRIMARY KEY 約束的列定義;此例由系統(tǒng)提供約束名。



    job_id   smallint
        PRIMARY KEY CLUSTERED


    下例顯示如何為 PRIMARY KEY 約束提供名稱。此約束用于 employee 表中的 emp_id 列。此列基于用戶定義數(shù)據(jù)類型。



    emp_id   empid
        CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED


    B. 使用 FOREIGN KEY 約束


    FOREIGN KEY 約束用于引用其它表。FOREIGN KEY 可以是單列鍵或多列鍵。下例顯示 employee 表上引用 jobs 表的單列 FOREIGN KEY 約束。對于單列 FOREIGN KEY 約束,只需要 REFERENCES 子句。



    job_id   smallint      NOT NULL
        DEFAULT 1
        REFERENCES jobs(job_id)


    也可以顯式使用 FOREIGN KEY 子句并復(fù)述列特性。注意在這兩個表中列名不必相同。



    FOREIGN KEY (job_id) REFERENCES jobs(job_id)


    多列鍵約束作為表約束創(chuàng)建。在 pubs 數(shù)據(jù)庫中,sales 表包含多列 PRIMARY KEY。下例顯示如何從其它表中引用此鍵(可選擇顯式約束名)。



    CONSTRAINT FK_sales_backorder FOREIGN KEY (stor_id, ord_num, title_id)
      REFERENCES sales (stor_id, ord_num, title_id)


    C. 使用 UNIQUE 約束


    UNIQUE 約束用于強(qiáng)制非主鍵列的唯一性。PRIMARY KEY 約束列自動包含唯一性限制;但是,UNIQUE 約束允許存在空值。下例顯示表 authors 中名為 pseudonym 的列。該列強(qiáng)制作者筆名必須唯一。



    pseudonym varchar(30)   NULL
    UNIQUE NONCLUSTERED


    下例顯示在 stor_id 實(shí)際上是 PRIMARY KEY 的 stores 表中,stor_name 列和 city 列上創(chuàng)建的 UNIQUE 約束;同一個城市中的商店不應(yīng)同名。



    CONSTRAINT U_store UNIQUE NONCLUSTERED (stor_name, city)


    D. 使用 DEFAULT 定義


    使用 INSERT 和 UPDATE 語句時,如果沒有提供值,則默認(rèn)值會提供值。在 pubs 數(shù)據(jù)庫中,使用了許多 DEFAULT 定義以確保輸入有效的數(shù)據(jù)或占位符。



    jobs 表上,當(dāng)沒有顯式輸入實(shí)際的描述信息時,默認(rèn)的字符串將提供描述信息(列 job_desc)。



    DEFAULT 'New Position - title not formalized yet'


    employee 表中,員工可以受雇于子公司或母公司。如果沒有顯式提供公司信息,則輸入母公司(注意在表定義中可以嵌套注釋,如下所示)。



    DEFAULT ('9952')
    /* By default the Parent Company Publisher is the company
    to whom each employee reports. */


    除了常量以外,DEFAULT 定義還可以包含函數(shù)。使用下例獲取輸入項(xiàng)的當(dāng)前日期:



    DEFAULT (getdate())


    niladic 函數(shù)也可以提高數(shù)據(jù)的完整性。若要跟蹤插入行的用戶,請使用 niladic 函數(shù) USER(niladic 函數(shù)不使用括號):



    DEFAULT USER


    E. 使用 CHECK 約束


    下例顯示對輸入到 jobs 表中的 min_lvl 列和 max_lvl 列的值的限制。這兩個約束都未命名:



    CHECK (min_lvl >= 10)




    CHECK (max_lvl <= 250)


    下例顯示對輸入到 employee 表的 emp_id 列中的字符數(shù)據(jù)具有模式限制的命名約束。



    CONSTRAINT CK_emp_id CHECK (emp_id LIKE 
      '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' OR
      emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]')


    下例指定 pub_id 必須在特定的列表中或遵循給定的模式。此約束用于 publishers 表中的 pub_id 列。



    CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756')
      OR pub_id LIKE '99[0-9][0-9]')


    F. 完整的表定義


    下例顯示 pubs 數(shù)據(jù)庫中所創(chuàng)建的三個表(jobs、employeepublishers)的完整表定義,其中包含所有的約束定義。



    /* ************************** jobs table ************************** */
    CREATE TABLE jobs
    (
      job_id smallint
        IDENTITY(1,1)
        PRIMARY KEY CLUSTERED,
      job_desc     varchar(50)   NOT NULL
        DEFAULT 'New Position - title not formalized yet',
      min_lvl tinyint NOT NULL
        CHECK (min_lvl >= 10),
      max_lvl tinyint NOT NULL
        CHECK (max_lvl <= 250)
    )

    /* ************************* employee table ************************* */
    CREATE TABLE employee
    (
      emp_id empid
        CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED
        CONSTRAINT CK_emp_id CHECK (emp_id LIKE
          '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or
          emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'),
        /* Each employee ID consists of three characters that
        represent the employee's initials, followed by a five
        digit number ranging from 10000 through 99999 and then the
        employee's gender (M or F). A (hyphen) - is acceptable
        for the middle initial. */
      fname   varchar(20)   NOT NULL,
      minit   char(1) NULL,
      lname   varchar(30)   NOT NULL,
      job_id smallint     NOT NULL
        DEFAULT 1
        /* Entry job_id for new hires. */
        REFERENCES jobs(job_id),
      job_lvl tinyint
        DEFAULT 10,
        /* Entry job_lvl for new hires. */
      pub_id char(4) NOT NULL
        DEFAULT ('9952')
        REFERENCES publishers(pub_id),
        /* By default, the Parent Company Publisher is the company
        to whom each employee reports. */
      hire_date     datetime     NOT NULL
        DEFAULT (getdate())
        /* By default, the current system date is entered. */
    )

    /* ***************** publishers table ******************** */
    CREATE TABLE publishers
    (
      pub_id char(4) NOT NULL
          CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED
          CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756')
            OR pub_id LIKE '99[0-9][0-9]'),
      pub_name     varchar(40)   NULL,
      city       varchar(20)   NULL,
      state     char(2) NULL,
      country     varchar(30)   NULL
            DEFAULT('USA')
    )


    G. 在列中使用 uniqueidentifier 數(shù)據(jù)類型


    下例創(chuàng)建含有 uniqueidentifier 列的表。該表使用 PRIMARY KEY 約束以確保用戶不會在表中插入重復(fù)的值,并在 DEFAULT 約束中使用 NEWID() 函數(shù)為新行提供值。



    CREATE TABLE Globally_Unique_Data
    (guid uniqueidentifier
      CONSTRAINT Guid_Default
      DEFAULT NEWID(),
    Employee_Name varchar(60),
    CONSTRAINT Guid_PK PRIMARY KEY (Guid)
    )


    H. 對計(jì)算列使用表達(dá)式


    下例顯示如何使用表達(dá)式 ((low + high)/2) 計(jì)算 myavg 計(jì)算列。



    CREATE TABLE mytable 
      (
      low int,
      high int,
      myavg AS (low + high)/2
      )


    I. 對計(jì)算列使用 USER_NAME 函數(shù)


    下例在 myuser_name 列中使用 USER_NAME 函數(shù)。



    CREATE TABLE mylogintable
      (
      date_in datetime,
      user_id int,
      myuser_name AS USER_NAME()
      )


    J. 使用 NOT FOR REPLICATION


    下例顯示如何在訂閱了復(fù)制的表中使用 IDENTITY 屬性。此表包含 CHECK 約束,以確保此系統(tǒng)生成的 SaleID 值不會增長到為復(fù)制發(fā)布服務(wù)器指派的范圍內(nèi)。



    CREATE TABLE Sales
      (SaleID INT IDENTITY(100000,1) NOT FOR REPLICATION,
            CHECK NOT FOR REPLICATION (SaleID <= 199999),
      SalesRegion CHAR(2),
      CONSTRAINT ID_PK PRIMARY KEY (SaleID)
      )
    相關(guān)文章
    本頁查看次數(shù):