約束的類型
- 域約束,對列數據進行約束
- 實體約束,對行數據進行約束
- 參照完整性約束,比如:外鍵約束
鍵約束
1、主鍵約束
主鍵必須是唯一標識符,不能爲NULL
1)在創建表的時候創建主鍵約束
直接在列名後輸入 PRIMARY KEY 創建主鍵。
2)、在已存在的表上創建主鍵約束
語法:
ALTER TABLE <表名>
ADD CONSTRAINT <鍵名>
PRIMARY KEY (<列名>)
主鍵約束例子:
if Exists(select * from dbo.sysobjects where id=object_id(N'Carl'))
drop Table Carl
Create Table Carl
(
InCarlID int Primary key --在創建表時直接輸入主鍵約束
)
--主鍵不允許重複,不予許爲空
--insert into Carl (InCarlID) values (1)
--insert into Carl (InCarlID) values (1)
--insert into Carl (InCarlId)values(null)
if Exists(select * from dbo.sysobjects where id=object_id(N'Carl'))
drop Table Carl
Create Table Carl
(
InCarlID int not null
)
--在已有的表上創建主鍵
Alter Table Carl
Add Constraint PK_Carl
Primary Key (InCarlID)
--主鍵不允許重複,不予許爲空
--insert into Carl (InCarlID) values (1)
--insert into Carl (InCarlID) values (1)
--insert into Carl (InCarlId)values(null)
2、外鍵約束
一個表可以有0~253個外鍵。
在創建表的時候創建主鍵約束,在列名後面輸入
FOREIGN KEY REFERENCES <表名> <列名>。
1)在已存在的表中添加一個外鍵
語法:
ALTER TABLE <表名>
ADD CONSTRAINT <鍵名>
FOREIGN KEY (<列名>)
REFERENCES <表名> <列名>
例子:
if Exists(select * from sysobjects where id=object_id(N'ForeignCarl'))
drop Table ForeignCarl
if Exists(select * from sysobjects where id=object_id(N'PrimaryCarl'))
drop Table PrimaryCarl
Create Table PrimaryCarl
(
InCarlID int Primary Key--主鍵
)
--在創建表的時候創建外鍵約束
Create Table ForeignCarl
(
InCarlID int not null Foreign Key References PrimaryCarl (InCarlID) --外鍵
)
--不能在外鍵的表插入主鍵值沒有的值
--insert into PrimaryCarl values(1)
--insert into ForeignCarl values(2)
--insert into ForeignCarl values(1)
if Exists(select * from sysobjects where id=object_id(N'ForeignCarl'))
drop Table ForeignCarl
if Exists(select * from sysobjects where id=object_id(N'PrimaryCarl'))
drop Table PrimaryCarl
Create Table PrimaryCarl
(
InCarlID int Primary Key--主鍵
)
--在已存在的表中創建外鍵約束
Create Table ForeignCarl
(
InCarlID int
)
Alter Table ForeignCarl
ADD Constraint FK_Carl
Foreign Key (InCarlID)
References PrimaryCarl (InCarlID)
insert into PrimaryCarl values(1)
--不能在外鍵的表插入主鍵值沒有的值
--insert into ForeignCarl values(2)
insert into ForeignCarl values(1)
select * from PrimaryCarl
select * from ForeignCarl
2)使一個表自引用(不明白)
希望引用的列在不再別的表中。
添加自引用時,表裏必須有一行元素。
例子:
if Exists(select * from sysobjects where id=object_id(N'ForeignCarl'))
drop Table ForeignCarl
if Exists(select * from sysobjects where id=object_id(N'PrimaryCarl'))
drop Table PrimaryCarl
Create Table ForeignCarl
(
FKCarlID int
)
insert into ForeignCarl values(1)
Alter Table ForeignCarl
Add Constraint PK_Carl
Foreign Key (FKCarlID)
References PrimaryCarl (PKCarlID)
Create Table PrimaryCarl
(
PKCarlID int Primary Key,
)
3)級聯動作
設置了級聯動作後,主表的操作會對子表的操作產生影響。
CASCADE表示在主表中執行的操作會影響外建的數據,
NO ACTION是不可以在未刪除外表的值的情況下刪除主表中的值。
SET NULL表示外表的值會變成NULL,SET DEFAULT 表示外表的值會變成默認值。(2005新功能)
語法:在創建外鍵的後面加上
ON UPDATE|DELETE CASCADE
例子:
If Exists (select * from sysobjects where id=object_id(N'PKCarl'))
drop Table PKCarl
If Exists (select * from sysobjects where id=object_id(N'FKCarl'))
drop Table FKCarl
Create Table PKCarl
(
PKCarlID int Primary Key
)
Create Table FKCarl
(
FKCarlID int Foreign Key References PKCarl (PKCarlID)
on update cascade --級聯更新
on delete cascade --級聯刪除
--set null --級聯設置null值 2005新功能
--set default --級聯設置默認值 2005新功能
)
insert into PKCarl values (1)
insert into FKCarl values (1)
update PKCarl Set PKCarlID=2
delete PKCarl
select * from PKCarl
select * from FKCarl
4)關於外鍵的其他方面考慮
一、如何使外鍵中的值爲必須的和可選的
二、外鍵實現雙向的方式
3、唯一約束
唯一約束會把NULL也當成唯一的值。
語法:創建表時在列名後面直接加上:UNIQUE
1)在已存在的表中創建唯一約束
語法:
ALTER TABLE <表名>
ADD CONSTRAINT <鍵名>
UNIQUE (列名)
例如:
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Carl]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [dbo].[Carl]
Create Table Carl
(
InCarlID int --Unique --創建表時創建唯一約束
)
--在已有的表中創建唯一約束
Alter Table Carl
Add Constraint UCarl
Unique (InCarlID)
insert into Carl values(1)
--insert into Carl values(1)
insert into Carl values(2)
select * from Carl
CHECK約束
與WHERE中的規則一樣。
語法:
ALTER TABLE <表名>
ADD CONSTRAINT <鍵名>
CHECK (和WHERE一樣的條件語句)
例子:
Create Table #Carl
(
InCarlID int
)
Alter Table #Carl
ADD Constraint C_Carl
Check ( InCarlID between 1 and 12 or
InCarlID like '[0-9][0-9]' or
InCarlID in (123,456,789) or
InCarlID <=0)
insert into #Carl values (-1)
select * from #Carl
drop Table #Carl
DEFAULT約束
默認值只在INSERT語句中使用。
1、在CREATE TABLE語句中定義DEFAULT約束
語法:在列名後面加上 DEFAULT <默認值>
2、在已存在的表中添加DEFAULT約束
語法:
ALTER TABLE <表名>
ADD CONSTRAINT <鍵名>
DEFAULT <默認值> FOR <列名>
例子:
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Carl]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [dbo].[Carl]
Create Table Carl
(
InCarlID int identity(1,3),
CarlID int,
CarlName varchar(50) Default 'Carl',--默認約束
CarlTime datetime
)
--在已有表創建默認約束
Alter Table Carl
Add Constraint D_Carl
Default GetDate() For CarlTime
insert into Carl (CarlID) values (1)
select * from Carl
禁用約束
約束只能禁用(主鍵約束和唯一約束不能禁用)。
1)在創建約束時忽略無效的數據
禁用約束主要用在,在創建約束時,表已經存在數據不符合約束裏的條件,這時就需要禁用約束。
語法:在創建約束前加入:WITH NOCHECK
2)臨時禁用已存在的約束
用於在已經存在約束的情況下,別的表中導入到本表的數據不符合約束。
語法:在修改約束籤加入:NOCHECK
例子:
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Carl]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [dbo].[Carl]
Create Table Carl
(
InCarlID int not null
constraint PK_Carl
check (InCarlId > 1)
)
--禁用約束
Alter Table Carl
nocheck
constraint PK_Carl
insert into Carl values(1)
insert into Carl values(1)
select * from Carl
規則和默認值
爲了向後兼容而存在,不推薦使用。
是表或自身實際存在的對象。
1、規則
類似CHECK約束。
語法:
CREATE RULE <規則名>
AS <條件表達式,例:@Salay>0>
創建規則後需要用存儲過程激活。
語法:
sp_bindrule <’規則名’> <’表名.列名’> [標誌(具體功能見書)]
接觸綁定:sp_unbindrule。
1)刪除規則
語法:DROP RULE <規則名>
2、默認值
默認值和默認CHECK的概念要區分。
語法:
CREATE DEFAULT <默認名>
AS <值>。
綁定值和解除綁定語法和規則一樣,只不過存儲過程是sp_bindefault和sp_unbindefault。
1)刪除默認值
語法:DROP DEFAULT <默認名>
3、確定哪個表和數據類型使用給定的規則或默認值
可以使用存儲過程sp_depends<對象名>來查看哪些表使用了規則和默認值(不一定提供依賴列表)。