Sql Server约束的学习一(主键约束、外键约束、唯一约束)
一、约束的分类
1、实体约束
实体约束是关于行的,比如某一行出现的值不允许出现在其他行,例如主键约束。
2、域约束
域约束是关于列的,对于所有行,某一列有那些约束,例如检查约束。
3、参照完整性约束
若果某列的值必须与其他列的值匹配,那就意味着需要一个参照完整性约束,例如外键约束。
二、约束命名
1、系统创建约束名称
Sql Server我们不提供约束名称,会自动创建名称,但是创建的名称不是很有用。比如:
主键约束名:PK_Student_134351F, 检查约束名:CK_Student_544523A
PK(primary key)代表主键,Student代表创建主键的表,134351F代表是随机数。这样我们很难分配这些约束到底是做什么的。所以有了我们自己命名。
2、手动创建约束名称
我们构建约束名称的规则: 1)一致性 2)通俗易懂 3)简化名称
比如可以这样命名,主键约束:PK_Student_Uid, 检查约束:CK_Student_Age 等
三:约束介绍
1、主键约束
1)主键约束的定义
主键是每行的唯一标识符,通过它能准确定位到一行,主键列在整个表中不能重复,必须包含唯一值(也就是如果是主键,就必须不为null),它是所有键和约束中最重要的。
2)主键约束的创建
2.1) 在创建表的时候创建主键约束
/**在创建表时创建主键约束**/ create table Computer( compUid int not null identity(1,1) primary key, compName varchar(50) not null, Notes varchar(100) null )
执行后,生成数据表,主键约束名对应下图(系统自动产生约束名称)
2.2)在已存在表上创建主键约束
/***在已存在表中创建主键约束***/ --创建一个没有主键的数据表-- create table People( Uid int not null identity(1,1), Name varchar(20) not null ) --添加已存在数据表主键-- alter table People add constraint PK_PeoPle_Uid --主键名称 primary key(UId) --主键列
创建一个没有主键的数据表People
2.3)创建联合主键约束
联合主键,一般用一张表来描述其他两张表的关系或信息,如何读者表和书籍表的关系,可以有一个借书表(可以用联合主键来约束)
/**创建联合主键约束**/ --创建一个书籍表-- create table Book( bookId int identity(1,1) primary key, bookName varchar(20) not null, bookNotes varchar(100) null ) --创建一个读者表-- create table Reader( readId int identity(1,1) primary key, readerName varchar(20) not null, ) --创建一个借书表(没有主键)-- create table BookAndReader( bookId int not null, readId int not null, startDate datetime not null, endDate datetime not null, ) --添加借书表主键信息-- alter table BookAndReader add constraint [Pk_BookAndReader_BookId_ReadId] primary key nonclustered( bookId, readId )
执行后,结果如图所示:
2、外键约束
1)外键约束的定义
外键既能确保数据完整性,又能表现表之间的关系。添加外键后,插入引用表的记录要么必须被引用表的某条记录匹配,要么外键列的值必须设置为null。
外键和主键不一样,每个表的外键数目不限制唯一性,在每个表中,外键数量范围0到253个外键,唯一现在是一个列只能引用一个外键,一个列可被多个外键引用。
2)外键约束的创建
2.1)创建表时创建外键约束
--创建一个班级表-- create table Class( Uid int not null identity primary key, Name varchar(20) not null, Notes varchar(100) not null ) --创建一个教师表--- create table Teacher( Uid int not null identity primary key, Name varchar(20) not null, ClassId int not null foreign key references Class(Uid), --外键,引用班级表的Uid Notes varchar(100) not null )
执行后,结果视图如下:
2.2)在已存在表中添加外键约束
--创建一个班级表-- create table Class( Uid int not null identity primary key, Name varchar(20) not null, Notes varchar(100) not null ) --创建一个教师表--- create table Teacher( Uid int not null identity primary key, Name varchar(20) not null, ClassId int not null , Notes varchar(100) not null ) --添加外键约束--- alter table Teacher add constraint FK_Teacher_Class_ClassId_Id foreign key (ClassId) references Class(UId)
执行后(前提先删除之前创建表),结果视图如下:
2.3)级联动作
Sql Server的默认行为是在子行存在是“限制”父行被删除。有时会自动删除任何依赖的记录,而不是防止删除被引用的记录。同样在更新记录时,可以希望依赖的记录自动引用刚刚更新的记录。这种进行自动删除和自动更新过程称为级联。(通俗的说:我删除、更新父行记录,关联的子行记录自动删除或自动更新)
运用上面创建的班级表和教师表和外键约束为例,我来演示级联删除操作
--添加表数据-- insert into Class values('一班','第一个班级') insert into Class values('二班','第二个班级') insert into Teacher values('吴老师',1,'吴老师人很好') insert into Teacher values('李老师',2,'李老师人很漂亮') --查询班级表和教师表-- select * from Class select * from Teacher
执行后的结果如下
当我执行删除父行(Class)记录,级联到子行(Teacher),删除不了,触发外键约束
--删除父行(Class),删除不了-- delete from Class where Uid =1
执行后,结果如下:
那么如何级联删除父行记录呢?
替换之前添加的外键约束,再次执行删除操作
--替换外键约束(设置删除父行级联到子行)--- alter table Teacher add constraint FK_Teacher_Class_ClassId_Uid foreign key (ClassId) references Class(Uid) on update no action --修改时,不级联更新子表 on delete cascade --删除时,级联删除依赖项 --删除父行(Class)-- delete from Class where Uid =1 --查询班级表、教师表-- select * from Class select * from Teacher
执行后,结果如图所示(已级联删除):
3、唯一约束
1)唯一约束的定义
唯一约束与主键约束类似,共同点在他们都要求表中指定列上有一个唯一值,区别是唯一约束没有被看作表中记录的唯一标识,一个表可以有多个唯一约束,但只能有一个主键约束。
2)唯一约束的创建
2.1) 在创建表时创建唯一约束
/**创建学生表后添加唯一约束**/ --创建学生表-- create table Student( Uid int not null identity(1,1) primary key, --主键约束-- Name varchar(20) not null unique, --唯一约束-- TeaUid int not null foreign key references Teacher(Uid), --外键约束-- Notes varchar(100) null )
执行后,结果如下图:
2.2)在已生成表创建唯一约束
--创建学生表(创建时不建立唯一约束)-- create table Student( Uid int not null identity(1,1) primary key, --主键约束-- Name varchar(20) not null, TeaUid int not null foreign key references Teacher(Uid), --外键约束-- Notes varchar(100) null ) --添加唯一约束-- alter table Student add constraint UQ_Student_Name unique(Name)
执行后,结果如下:
3) 验证唯一约束作用
--添加两行相同名称的数据-- insert into Student(Name,TeaUid) values('张小娴',2) insert into Student(Name,TeaUid) values('张小娴',2) --查询结束-- select * from Student
执行后,结果如下图所示:
下一篇介绍Sql Server 约束学习二(检查约束、默认约束、禁用约束)
参考学习网址:
http://www.cnblogs.com/kissdodog/archive/2013/05/31/3109509.html