建站學院(LieHuo.Net)SQL教程 你知道SQL SERVER中約束到底有幾種嗎?你知道約束與主鍵是什么關系嗎?你知道約束該如何使用嗎?如果你對這幾個問題還有疑問,那么就請繼續往下看吧。
SQL SERVER 2005中,約束,Constraints,顧名思義,就是按照約定來束縛某種東西。在數據庫,無非就是對存儲的數據進行束縛,當然需要按照某種既定的規則,一般是指語義的限制以及用來制約屬性上的關系。可能在平時的工作中,尤其是對開發人員來說,約束用的不是很多,更多的時候是用代碼去做一些輸入的驗證,這其實就是約束的思想,把不滿足條件的數據排除在外。其實SQL SERVER 2005也給我們提供這樣的一些約束:
1. Check Constraints
我相信大部分的朋友對約束的概念理解應該都是Check類型的約束,這種約束對表中的某一列的格式或者值進行限制,只有滿足條件的數據才能被寫入。比如:
create table Goods( GoodsID int identity(1,1) primary key, Price decimal(12,4) constraint chkPrice check (Price>1000))
上面的SQL建立了一張新表,并且對表中的列Price建立一個check約束,名叫chkPrice,它的作用就是對插入price列的數據進行判斷,如果大于1000,滿足條件就插入,否則就報錯。
insert into Goods values(2000) (1 row(s) affected) 成功
insert into Goods values(200) ERROR:The INSERT statement conflicted with the CHECK constraint "chkPrice". The conflict occurred in database "AdventureWorks", table "dbo.Goods", column 'Price'.
這里順便提一下,如果我們執行了下面的代碼,結果會是怎樣呢?
insert into goods values(null)
如果你覺得也會報錯,那么恭喜你,你錯了。約束其實是對滿足條件,即條件表達式返回TRUE的一律通過。那么,如果結果是NULL呢?NULL在SQL SERVER里的類型是UNKNOWN,就是不知道。那我們就要把它理解成可以成為任何類型,可能為TRUE。所以在這個例子中,NULL是可以被插入的。
2. Default Constraints
這個約束相對簡單一些,就是事先定義一個默認值,如果在插入數據的時候沒有指定,系統會自動把事先定義好的默認值寫入對應的列。
create table Product(ProductID int identity(1,1) primary key,ProductName varchar(80) not null,Country varchar(40) default 'China')Country這列就是一個含有Default約束的列,如果在插入一條數據的時候沒有指定值,那么系統會默認的插入China.
insert into product values('AAA','US')insert into product(ProductName) values('BBB')結果為
1 AAA US
2 BBB China
3. Unique Constraints
Unique就是獨有的,這個約束就是確保在非主鍵列中不輸入重復的值。這一點與主鍵的概念可能有一些類似,之所以把Unique放在前面說,就是為了強調一點,如果想強制一列或者多列的組合的唯一性時,應該選擇Unique而不是主鍵。
同時,還有一點,主鍵不能為null,但是Unique可以支持null。
alter table product add ProductCode int null constraint pc_unique unique我們對Product表中的ProductCode列設置了unique約束,這一列的值不可重復.但允許有空值存在.
insert into product (productname,ProductCode) values('aaa',null)OK
第一個空值插入成功
insert into product (productname,ProductCode) values('bbb',null)ERROR:Violation of UNIQUE KEY constraint 'pc_unique'. Cannot insert duplicate key in object 'dbo.product'.
第二個空值插入失敗
4. Primary Key Constraints
主鍵約束可能是大家最為熟悉的,在數據庫的設計中,我們基本上會對每一張表建一個主鍵約束,用以把數據庫的每條記錄(行)區分開來.主鍵可以針對表中的一列或多列。但與約束不同的是,它的值不能為空。
下面的例子是對其中一列設置主鍵:
Create Table Users(UserID int primary key,UserName varchar(50) not null)
下面是對多列設置主鍵:
CREATE TABLE KeyData( FiscalYear int not null, Period int not null, DataType int not null, KeyValue int not null CONSTRAINT [PK_constraint_keydata] PRIMARY KEY CLUSTERED ( FiscalYear, Period ))
5. Foreign Key Constraints
前面提到約束分語義上限制和屬性關系的限制,外鍵約束就是用來限制屬性間關系的。通俗一點講,就是一張表中的某列引用了另一張表的主鍵,因為該列的值必須出自主鍵列的值。
Create table Manager( ManagerID int primary key, ManagerName varchar(50),)上面我們建立了一個Manager的表,有一個ID列是該表的主鍵,唯一代表了每一個經理。
下面建立了銷售區域的表,并指定每個區域有一個經理負責:
Create Table SalesRegion( SalesRegionID int Primary Key, SalesRegionName varchar(100), ManagerID int foreign key REFERENCES Manager(ManagerID))從上面的命令中可以看出,ManagerID就是外鍵,它的作用是連接了SalesRegion與Manager兩張表,限制ManagerID在表SalesRegion中的使用,我們不能把某個區域指定給一個不存在經理負責。如果我們試圖往SalesRegion插入一條記錄,而該記錄的ManagerID是Manager表中不存在的ManagerID,系統就會報出以下的錯誤:
The INSERT statement conflicted with the FOREIGN KEY constraint "FK__SalesRegi__Manag__3F6663D5". The conflict occurred in database "AdventureWorks", table "dbo.Manager", column 'ManagerID'.
文章來自:http://www.cnblogs.com/PumpkinDatabase/archive/2009/07/02/1432084.html