主鍵是用來強制一個欄位或多個欄位組合值的唯一性,且不允許該欄位值為空白值。在一個表中只能設定一個主鍵約束,但可以將包含多個欄位的欄位組合設定為主鍵。主鍵約束分為欄位級約束和表級約束。欄位級約束是為某一個欄位設定約束。在設定欄位級約束時,只需將建立主鍵約束的語句添加到該欄位的定義子句後面。所謂表級約束是將將多個欄位的欄位組合設定為主鍵。
一個表中有且只能有一個主鍵約束,它用來約束一個欄位或多個欄位組合的唯一值,並且不可為空白。他與唯一性限制式的區別在於一個表中可以有多個唯一性限制式,並且其欄位可以為空白,唯一性限制式的唯一性是指欄位值的唯一此特性跟主鍵的作用一致。
主鍵約束的對像是針對錶內而外鍵約束定義了表與表之間的關係。當一個表中的一個列或多個列的組合和其它表中的主關鍵字定義相同時,就可以將這些列或列的組合定義為外關鍵字,並設定它是和哪個表中哪些列相關聯。通常被設定了主鍵的表為父表,而設定外鍵的表為父表的從屬表也稱為子表。這樣,當父表(在定義主關鍵字約束的表)中更新列值時,子表(其它表中有與父表相關聯的外關鍵字約束的表)中的外關鍵字列也將被相應地做相同的更新。外關鍵字約束的作用還體現在,當子表插入資料時,如果父表表的列中沒有與插入的外關鍵字列值相同的值時,系統會拒絕插入資料,即父表更新資料時子表也隨之更新具有相同約束的相同的資料,而當子表更新與父表相關聯的資料時如父表不存在所更新的資料則系統就會拒絕插入,體現父與子的一致性也體現了子從父的從屬關係。
例:
/*建庫,名為student_info使用student_info建student表,其中s_id為主鍵建test表,其中test_no為主鍵建marks表,其中marks表中的s_id和test_no為外建,分別映射student表中的s_id和test表中的test_no*/create database student_infouse student_infogocreate table student(s_id int identity(1,1) primary key,s_name varchar(20) not null,s_age int)gocreate table test(test_no int identity(1,1) primary key,test_name varchar(30),nax_marks int not null default(0),min_marks int not null default(0))gocreate table marks(s_id int not null,test_no int not null,marks int not null default(0),primary key(s_id,test_no),foreign key(s_id) references student(s_id) on update cascade on delete cascade,foreign key(test_no) references test(test_no)on update cascade on delete cascade)go
串聯更新,串聯刪除,這樣在刪除主表Student時,成績表中該學生的所有成績都會刪除。
總之主鍵與外鍵都是用來對資料進行約束的,主鍵確定值的唯一性為索引提供方便從而提高資料查詢的速度,而外鍵是用來對錶與表之間的資料進行約束,外鍵主要用於級聯式更新資料、刪除資料,從而達到保護資料庫資料完整性的目的。使用外鍵之前必須先建立主鍵。