SQL Server 2008编程入门经典笔记:约束

来源:互联网 发布:c语言基础入门知识 编辑:程序博客网 时间:2024/05/29 12:32

约束的类型

  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 CarlCreate 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 CarlCreate Table Carl(InCarlID int not null)--在已有的表上创建主键Alter Table CarlAdd Constraint PK_CarlPrimary 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 ForeignCarlif Exists(select * from sysobjects where id=object_id(N'PrimaryCarl'))drop Table PrimaryCarlCreate 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 ForeignCarlif Exists(select * from sysobjects where id=object_id(N'PrimaryCarl'))drop Table PrimaryCarlCreate Table PrimaryCarl(InCarlID int Primary Key--主键)--在已存在的表中创建外键约束Create Table ForeignCarl(InCarlID int)Alter Table ForeignCarlADD Constraint FK_CarlForeign Key (InCarlID)References PrimaryCarl (InCarlID)insert into PrimaryCarl values(1)--不能在外键的表插入主键值没有的值--insert into ForeignCarl values(2)insert into ForeignCarl values(1)select * from PrimaryCarlselect * from ForeignCarl

2)使一个表自引用(不明白)
希望引用的列在不再别的表中。
添加自引用时,表里必须有一行元素。

例子:

if Exists(select * from sysobjects where id=object_id(N'ForeignCarl'))drop Table ForeignCarlif Exists(select * from sysobjects where id=object_id(N'PrimaryCarl'))drop Table PrimaryCarlCreate Table ForeignCarl(FKCarlID int )insert into ForeignCarl values(1)Alter Table ForeignCarlAdd Constraint PK_CarlForeign 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 PKCarlIf Exists (select * from sysobjects where id=object_id(N'FKCarl'))drop Table FKCarlCreate 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=2delete PKCarlselect * from PKCarlselect * 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 CarlAdd Constraint UCarlUnique (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 #CarlADD Constraint C_CarlCheck ( 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 #Carldrop 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 CarlAdd Constraint D_CarlDefault GetDate() For  CarlTimeinsert 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 nullconstraint PK_Carlcheck (InCarlId > 1))--禁用约束Alter Table Carlnocheckconstraint PK_Carlinsert 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<对象名>来查看哪些表使用了规则和默认值(不一定提供依赖列表)。

阅读全文
0 0
原创粉丝点击