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<对象名>来查看哪些表使用了规则和默认值(不一定提供依赖列表)。

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