一、约束的分类
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
执行后,结果如下图所示: