SQL Server 2008編程入門經典筆記:約束

約束的類型

  1. 域約束,對列數據進行約束
  2. 實體約束,對行數據進行約束
  3. 參照完整性約束,比如:外鍵約束

鍵約束

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 --級聯設置null2005新功能
--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<對象名>來查看哪些表使用了規則和默認值(不一定提供依賴列表)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章