一、约束的分类

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
)

执行后,生成数据表,主键约束名对应下图(系统自动产生约束名称)

sql server2019外键约束 sql server中外键约束_外键约束

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

sql server2019外键约束 sql server中外键约束_外键_02


执行后,添加数据表主键,主键约束名对应下图(手动创建约束名称)

sql server2019外键约束 sql server中外键约束_外键约束_03


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
)

执行后,结果如图所示:

sql server2019外键约束 sql server中外键约束_外键约束_04

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
)

执行后,结果视图如下:

sql server2019外键约束 sql server中外键约束_主键_05

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)

执行后(前提先删除之前创建表),结果视图如下:

sql server2019外键约束 sql server中外键约束_主键_06

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

执行后的结果如下

sql server2019外键约束 sql server中外键约束_主键_07

 当我执行删除父行(Class)记录,级联到子行(Teacher),删除不了,触发外键约束

--删除父行(Class),删除不了--
delete from Class where Uid =1

执行后,结果如下:

sql server2019外键约束 sql server中外键约束_sql server2019外键约束_08

那么如何级联删除父行记录呢?

替换之前添加的外键约束,再次执行删除操作

--替换外键约束(设置删除父行级联到子行)---
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

执行后,结果如图所示(已级联删除):

sql server2019外键约束 sql server中外键约束_主键_09

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
)

执行后,结果如下图:

sql server2019外键约束 sql server中外键约束_sql server2019外键约束_10

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)


执行后,结果如下:

sql server2019外键约束 sql server中外键约束_主键_11

3) 验证唯一约束作用

--添加两行相同名称的数据--
insert into Student(Name,TeaUid) values('张小娴',2)
insert into Student(Name,TeaUid) values('张小娴',2)
--查询结束--
select * from Student

执行后,结果如下图所示:

sql server2019外键约束 sql server中外键约束_外键约束_12