sql中表級約束和列級約束

sql中表級約束和列級約束,在SQL SERVER中,

(1) 對于基本表的約束分為列約束和表約束

約束是限制用戶輸入到表中的數據的值的范圍,一般分為列級約束與表級約束。

列級約束有六種:主鍵Primary key、外鍵foreign key 、唯一 unique、檢查 checck 、默認default 、非空/空值 not null/ null

表級約束有四種:主鍵、外鍵、唯一、檢查

列約束是對某一個特定列的約束,包含在列定義中,直接跟在該列的其他定義之后,用空格分隔,不必指定列名;

表約束與列定義相互獨立,不包括在列定義中,通常用于對多個列一起進行約束,與列定義用’,’分隔,定義表約束時必須指出要約束的那些列的名稱。完整性約束的基本語法格式為:

[ CONSTRAINT <約束名> ] <約束類型>

約束名:約束不指定名稱時,系統會給定一個名稱。

(2)列級約束與表級約束的區別

如果完整性約束涉及到該表的多個屬性列,必須定義在表級上,否則既可以定義在列級也可以定義在表級。

簡而言之:

列級約束:列級約束是行定義的一部分,只能應用于一列上。

表級約束:表級約束是獨立于列的定義,可以應用在一個表中的多列上。

(3)列級約束與表級約束在SQL中的用法(即如何在SQL中定義約束)

在創建表時定義約束:

CREATE TABLE table_name

({?-------列級約束定義

|column_name AS computed_column_expression -------計算列定義

|?------表級約束定義

}[,….n]

)

一個約束定義為列級約束還是表級約束???

根據實際需要和設計者思路確定。如primary key,當只涉及到一列時,定義為列級約束;當涉及到多列時,則定義為表級約束。

Prinmary key定義為列級約束時,相應SQL語句:

Stu_id上建立的主鍵pk_1為列級約束

CREATE TABLE student

(Stu_id int constraint pk_1 primary key,

Stu_name varchar(8),

….)

當定義為表級約束時,相應SQL語句:

CREATE TABLE student

(Stu_id int NOT NULL,

Stu_id上建立的主鍵pk_1為的表級約束

Stu_name varchar(8),

Constraint pk_1 primary key (Stu_id),

….)

各約束具體說明:

1. 主鍵約束

PRIMARY KEY約束

PRIMARY KEY約束用于定義基本表的主鍵,起唯一標識作用,其值不能為NULL,也不能重復,以此來保證實體的完整性。

PRIMARY KEY與UNIQUE約束類似,通過建立唯一索引來保證基本表在主鍵列取值的唯一性,但它們之間存在著很大的區別:

①在一個基本表中只能定義一個PRIMARY KEY約束,但可定義多個UNIQUE約束;

②對于指定為PRIMARY KEY的一個列或多個列的組合,其中任何一個列都不能出現空值,而對于UNIQUE所約束的唯一鍵,則允許為空。

注意:不能為同一個列或一組列既定義UNIQUE約束,又定義PRIMARY KEY約束。

PRIMARY KEY既可用于列約束,也可用于表約束。

PRIMARY KEY用于定義列約束時,其語法格式如下:

CONSTRAINT <約束名> PRIMARY KEY

PRIMARY KEY用于定義表約束時,即將某些列的組合定義為主鍵,其語法格式如下:

[CONSTRAINT <約束名>]S PRIMARY KEY (<列名>[{<列名>}])

2. 唯一性(UNIQUE)約束

UNIQUE約束用于指明基本表在某一列或多個列的組合上的取值必須唯一。

定義了UNIQUE約束的那些列稱為唯一鍵,系統自動為唯一鍵建立唯一索引,從而保證了唯一鍵的唯一性。

唯一鍵允許為空,但系統為保證其唯一性,最多只可以出現一個NULL值。

UNIQUE既可用于列約束,也可用于表約束。

UNIQUE用于定義列約束時,其語法格式如下:

[CONSTRAINT <約束名>] UNIQUE

唯一性約束用于指定一個或者多個列的組合的值具有唯一性,以防止在列中輸入重復的值。當使用唯一性約束時,需要考慮以下幾個因素:

①使用唯一性約束的字段允許為空值。

②一個表中可以允許有多個唯一性約束。

③可以把唯一性約束定義在多個字段上。

④唯一性約束用于強制在指定字段上創建一個唯一性索引。

⑤缺省情況下,創建的索引類型為非聚簇索引。

unique約束是用來確保不受主鍵約束列上的數據的唯一性.

unique與primary key的區別在于:

(1)unique約束主要用于非主鍵的一列或多列上要求數據唯一.

(2) unique約束允許該列上存在NULL值,而主鍵決不允許出現.

(3)可以在一個表創建多個unique約束,而在一個表上只能夠設置一個主鍵

3. 檢查約束

CHECK約束用來檢查字段值所允許的范圍,如,一個字段只能輸入整數,而且限定在0-100的整數,以此來保證域的完整性。

CHECK既可用于列約束,也可用于表約束,

其語法格式為:

[CONSTRAINT <約束名>] CHECK (<條件>)

一個列級檢查約束只能與限制的字段有關;一個表級檢查約束只能與限制的表中字段有關。

一個表中可以定義多個檢查約束。

每個CREATE TABLE語句中每個字段只能定義一個檢查約束。

在多個字段上定義檢查約束,則必須將檢查約束定義為表級約束。

當執行INSERT語句或者UPDATE語句時,檢查約束將驗證數據。

檢查約束中不能包含子查詢。

4. 缺省約束

使用缺省約束時,應該注意以下幾點:

每個字段只能定義一個缺省約束。

如果定義的缺省值長于其對應字段的允許長度,那么輸入到表中的缺省值將被截斷。

不能加入到帶有IDENTITY屬性或者數據類型為timestamp的字段上。

如果字段定義為用戶定義的數據類型,而且有一個缺省綁定到這個數據類型上,則不允許該字段有缺省約束。

5. 外部鍵約束

外部鍵約束用于強制參照完整性,提供單個字段或者多個字段的參照完整性。 FOREIGN KEY約束指定某一個列或一組列作為外部鍵,其中,包含外部鍵的表稱為從表(參照表),包含外部鍵所引用的主鍵或唯一鍵的表稱主表(被參照表)。

系統保證從表在外部鍵上的取值要么是主表中某一個主鍵值或唯一鍵值,要么取空值。以此保證兩個表之間的連接,確保了實體的參照完整性。

FOREIGN KEY既可用于列約束,也可用于表約束,

其語法格式為:

[CONSTRAINT <約束名>] FOREIGN KEY REFERENCES <主表名> (<列名>[{<列名>}])

當使用外部鍵約束時,應該考慮以下幾個因素:

①外部鍵約束提供了字段參照完整性。

②外部鍵從句中的字段數目和每個字段指定的數據類型必須和REFERENCES從句中的字段相匹配。

③外部鍵約束不能自動創建索引,需要用戶手動創建。

④用戶想要修改外部鍵約束的數據,必須有對外部鍵約束所參考表的SELECT權限或者REFERENCES權限。

⑤參考同一表中的字段時,必須只使用REFERENCES子句,不能使用外部鍵子句。

⑥一個表中最多可以有31個外部鍵約束。

⑦在臨時表中,不能使用外部鍵約束。

⑧主鍵和外部鍵的數據類型必須嚴格匹配。

6. NULL 約束

(1)NULL/NOT NULL

是否允許該字段的值為NULL。

NULL值不是0也不是空白,更不是填入字符串“NULL”,而是表示“不知道”、“不確定”或“沒有數據”的意思。

當某一字段的值一定要輸入才有意義的時候,則可以設置為NOT NULL。

如主鍵列就不允許出現空值,否則就失去了唯一標識一條記錄的作用

只能用于定義列約束,

其語法格式如下:

[CONSTRAINT <約束名> ][NULL|NOT NULL]

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375

推薦閱讀更多精彩內容