在設計資料庫時,為了確保資料庫表中資料的品質,需要考慮資料的完整性(資料的完整性是指資料的正確性和一致性)。舉個例子:當你要為學生建立一個基本資料表StudentInfo時,這個表中學生的名字可以相同但是學號必須不一樣,而他的年齡也得限制在一定範圍內,像這樣類似的“限制”有很多,如果違反了這些限制就製造了與現實不符的失真資料即破壞了資料的完整性。因為資料庫不能自行判斷哪些資料失真,所以需要認為添加一些約束來保證資料的完整性。
資料庫中對錶的約束有五種:
1.主鍵約束(Primary Key constraint):主鍵列資料唯一,並且不允許為空白。
文法:Constraint 主鍵約束名 Primary Key [ Clustered | Nonclustered ] ( 列名1,[ 列名2,……,列名n ] )
主鍵是表中的一列或一組列,它們的值可以唯一地標識表中的每一行。
2.唯一約束(Unique constraint):該列資料唯一,允許為空白,但只能出現一個空值(不重複性)。
文法:Constraint 約束名 Unique [ Clustered | Nonclustered ] ( 列名1,[ 列名2,…… 列名n] )
唯一性限制式保證了除主鍵外的其他一個或一組列的資料具有唯一性,以防止在列中輸入重複的值。(一個表只可以有一個主鍵約束,如果其它列也不希望有重複就可以使用唯一性限制式。)
3.檢查約束(Check constraint):範圍限制、格式限制
文法:Constraint 約束名 Check [ Not For Replication ] ( 邏輯運算式 )
檢查約束使指定表中一列或一組列可以接受的資料值或格式。
4.預設約束(Default constraint):
文法:Constraint 約束名 Default 約束運算式 [ For 列名 ]
為指定列定義一個預設值。在輸入資料時,如果沒有輸入該列的值,則將該列的值設定為預設值。
5.外鍵約束(Foreign Key constraint):表間約束,確保資料的參照完整性
文法:Constraint 約束名 Foreign Key ( 列名1,[ 列名2,……列名n ] ) References 關聯表 ( 關聯列名1,[ 關聯列名2,……關聯列名n ] )
將當前表中的某一列或一組列關聯到另一個表的主鍵列,可建立兩個表之間的串連。當前表中的列就成為外鍵。外鍵涉及到兩個表,一個主表,一個從表 ,主表中的外鍵是從表中的主鍵
下面以“學生資訊”表為例,添加約束
Create table StudentInfo(StudentNo int not null,StudentID int,StudentName nvarchar(50) ,Sex varchar(2) ,Score float Default(0),--為學生的成績設定預設值0,在沒有資料輸入時,系統自動分配為0.DepartmentNo varchar(10),Constraint PK_Student Primary Key (StudentNo), --用“學號”作主鍵,只要有學號就可以唯一確定一位學生 Constraint IX_Student Unique(StudentID), --'為“身份證”添加唯一性限制式,當輸入的社會安全號碼有重複時會自動檢查出錯誤 Constraint CK_Student Check (Sex In ('男','女')), --'檢查學生的性別是否為男或女 --'“學生資訊”表與“院系”表建立外鍵約束,外鍵為學生資訊表的"所屬院系",從表的主鍵或候選索引鍵列為“院系”表的“記錄編號” Constraint FK_Student Foreign Key(DepartmentNo) References Department(RecordNo) )
約束的建立主要有兩種,以添加主鍵為例:
(1)建立表的時候建立約束,即在CreateTable中定義約束
Create StudentInfo(StudentNo vchar Primary Key,……)
或者
Create StudentInfo(StudentNo vchar,……Constraint PK_Student Primary Key(StudentNo)……)
(2)是向已經建立 好的表中添加約束,即在Alter Table中建立約束
Alter Table StudentInfo add Constraint PK_Student Primary Key (StudentNo)
刪除約束:對於存在外鍵約束的表,如果進行刪除非空的外鍵,可能會出現錯誤
Alter Table StudentInfo Drop Constraint PK_Student
約束是SQL Server提供的自動保持資料庫完整性的一種方法,定義了可輸入表或表的單個列中的資料的限制條件。對於資料庫來說,約束也可分為列約束(Column Constraint)和資料表條件約束(Table Constraint),列約束作為列定義的一部分只作用於此列本身,資料表條件約束作為表定義的一部分可以作用於多個列。約束只是資料庫對錶管理的一種,這些在以前學過,但是不太會用,所以對約束先做一個小結。