1. 程式人生 > >資料庫 SQL語言中 列級約束和表級約束

資料庫 SQL語言中 列級約束和表級約束

你知道嗎?約束分為列級約束和表級約束。

 

如果我們瞭解了這件事情,那麼當我們用T—SQL語句建立約束時,思路就會更加清晰。瞭解了這件事,相信我們會對約束有更進一步的理解。

 

大家都知道,在SQL Server 2000中有5種約束:

     主鍵約束(primary key )

      唯一性約束(unique)

    檢查約束(check)

    預設約束(default)

    外部鍵約束(foreign)

 

 

 

 

 由上圖可知,1,主鍵、外來鍵、唯一、檢查這四項,既可以建立列約束,也可以建立表約束。而預設 和 非空只能建立列約束。

                                         2,列級約束與表級約束的區別:

(1)列級約束只能應用於一列上。

           表級約束:可以應用於一列上,也可以應用在一個表中的多個列上。

即:如果你建立的約束涉及到該表的多個屬性列,則必須建立的是表級約束(必須定義在表級上);否則既可以定義在列級上也可以定義在表級上此時只是SQL語句格式不同而已)

(2)列級約束:包含在列定義中,直接跟在該列的其它定義之後 ,用空格分隔;不必指定列名  

          表級約束:

與列定義相互獨立,不包含在列定義中;與定義用‘,’分隔;必須指出要約束的列的名稱

因為在建立列級約束時,只需將建立列約束的語句新增到該欄位(列)的定義子句後面;而在建立表級約束時,需要將建立表級約束的語句新增到各個欄位(列)定義語句的後面,因為並不是每個定義的欄位都要建立約束,所以必須指明需要建立的約束的列名。)

     舉例說明:Create Table project

                        (

                             專案編號 int

                              Constraint  pk_pno  primary  key,

                              專案名稱 char(20),

                              專案負責人 char(20),

                              Constraint  un_pname_pm  unique(專案名稱,專案負責人)

                              )

     分析:“專案編號”欄位設定為主鍵,主鍵約束名為pk_pno,此主鍵約束為列主鍵約束“專案名稱”和“專案負責人”的組合欄位設定唯一性約束,此約束為表級約束)

 

各約束在建立列約束和表約束時的具體說明:

一:既可以建立列級約束又可以建立表級約束的:

 1,主鍵約束(primary  key  constraint):

       (1)定義列約束:Constraint <約束名> Primary Key

        (2)定義表約束[Constraint <約束名>] Primary Key( <列名> [{<列名>}])        

 

 2,唯一性約束(unique key constraint):

       (1)定義列約束:[Constrain <約束名>] Unique

       (2)定義表約束:Constrain <約束名>  Unique  ( <列名> [{<列名>}])        

 

 3,檢查約束(check constraint):

        既可以用於列約束,也可以用於表約束:  [Constraint <約束名>]  Check (<條件>)

       (注意:一個列級檢查約束只能與限制的欄位有關;一個 表級約束只能與限制的表中的欄位有關)

4外來鍵約束(foreign  key constrain:

            定義 列級約束:[Constraint <約束名>] Foreign key  References <外表名>

            定義表級約束:[Constraint <約束名>] Foreign key  References <外表名>( <列名> [{<列名>}])        

二:只能建立列級約束的:

1,預設約束(default constraint):

                [Constraint <約束名>] Default  約束條件

   

 2,Null 約束

                [Constraint <約束名>] [Null | Not Null]