♂️作者简介:生鱼同学,大数据科学与技术专业硕士在读,曾获得华为杯数学建模国家二等奖,MathorCup 数学建模竞赛国家二等奖,亚太数学建模国家二等奖。
✍️研究方向:复杂网络科学
兴趣方向:利用python进行数据分析与机器学习,数学建模竞赛经验交流,网络爬虫等。
**约束作用于表中字段上的规则,用于限制储存在表中的数据。**在本文中我们主要介绍SQL中约束分类以及约束以及约束的不同类型,并作出演示。
首先我们来看约束的主要分类,常见的约束分类如下:
约束 | 描述 | 关键字 |
---|---|---|
非空约束 | 限制该字段的数据不能为NULL | NOT NULL |
唯一约束 | 保证该字段的所有数据都是唯一、不重复的 | UNIQUE |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
检查约束 | 保证字段值满足一个条件 | CHECK |
外键约束 | 用来让两张表之间建立连接,保证数据的一致和完整 | FOREIGN KEY |
我们可以选择在创建表或修改表的过程中进行约束的添加。
接下来,我们将会根据不同的约束类型进行分别介绍与演示。
非空约束限制字段的数据不能为NULL,非空约束的关键字为NOT NULL。当我们希望在创建表的过程中添加非空约束的时候,我们可以使用下面的代码:
# 创建一个名为TABLE_NAME的表并且将Id和AGE设为非空
CREATE TABLE TABLE_NAME
(
Id int NOT NULL,
AGE varchar(10) NOT NULL
)
当表已经创建后,我们可以使用下面的代码为字段添加约束:
ALTER TABLE TABLE_NAME ADD NOT NULL ( Id )
在我的数据库中,我已经预先创建了表EMP,建表结构如下:
如果我们想为name加上非空的约束,可以使用下面的代码:
ALTER TABLE EMP MODIFY name varchar(255) NOT NULL;
结果如下:
当我们在这时想要插入一个数据的时候,我们发现没有name的设定已经不能够插入了:
另外,删除上述约束的代码为:
ALTER TABLE EMP MODIFY varchar(255) NOT NULL;
唯一约束表示该字段是唯一的,表示为UNIQUE。同样的添加唯一约束有两种方法,一种是在创建表结构的时候进行添加,另一种是创建表后进行更改,代码如下:
# 表示对AGE进行唯一约束
CREATE TABLE TABLE_NAME
(
Id int NOT NULL,
AGE varchar(10) UNIQUE
)
另外,我们还可以在建表的时候对某字段进行约束的命名,代码如下:
CREATE TABLE EMP
(
Id int NOT NULL,
AGE varchar(10)
CONSTRAINT UNIQUE EMP_ID_AGE UNIQUE (Id,AGE)
)
同样的,我们也可以在表创建后对唯一约束进行添加以及删除,代码如下:
# 为Id添加唯一约束
ALTER TABLE EMP ADD UNIQUE (Id);
ALTER TABLE EMP ADD CONSTRAINT uc_EMP_ID_AGE UNIQUE (Id,AGE);
# 删除名为uc_EMP_ID_AGE 的唯一约束
ALTER TABLE EMP DROP CONSTRAINT uc_EMP_ID_AGE;
主键在每个表中只有一个,其是唯一的值并且不能包括NULL值,同样的我们可以在创建表的过程中指定主键或者在创建表后添加主键,代码如下:
CREATE TABLE EMP
(
Id int PRIMARY KEY,
AGE varchar(10)
)
在创建表后,我们可以通过ALTER来进行主键的添加和取消,代码如下所示:
# 为名为TABLE_NAME 的表的字段Id添加主键
ALTER TABLE TABLE_NAME ADD PRIMARY KEY (Id)
# 删除表中的主键
ALTER TABLE TABLE_NAME DROP PRIMARY KEY
当我们想对某些字段进行默认值的设定时,可以使用默认约束,这种约束能够对插入的时候的数据赋予一个我们初始化的默认值,代码如下:
CREATE TABLE EMP
(
Id int NOT NULL,
NANME varchar(255) DEFAULT '无名氏'
)
或者在建表后对表格加上或者删除默认的约束,代码如下:
# 添加一个默认约束
ALTER TABLE EMP ALTER NANME SET DEFAULT '无名氏'
# 删除一个默认约束
ALTER TABLE EMP; ALTER NANME DROP DEFAULT;
当我们希望都某个字段的值进行检查时,可以使用检查约束限定范围,可以在建表的过程中对其添加检查的条件,代码如下:
# 在括号中传入约束条件
CREATE TABLE EMP
(
Id int NOT NULL CHECK (Id>0),
NANME varchar(255) NOT NULL
)
我们可以对后续添加的约束进行命名,从而更好的删除约束以及操作约束,代码如下:
ALTER TABLE EMP ADD CHECK (Id>0);
# 我们对该检查约束命名为chk_emp
ALTER TABLE EMP ADD CONSTRAINT chk_emp CHECK (Id>0 AND MAME='路人甲');
另外,删除约束也可以在建表之后进行。这时我们就可以利用其约束名,代码如下:
ALTER TABLE EMP DROP CONSTRAINT chk_emp;
添加外键可以把表进行链接,为了更好的解释外键,我们首先看一个例子:
假设我们员工表(EMP)如下:
Id | 名字 | 部门 |
---|---|---|
1 | 张三 | 1 |
2 | 李四 | 2 |
3 | 王五 | 3 |
我们还有一个部门表(PARTY)如下:
Id | 部门 |
---|---|
1 | 研发部 |
2 | 销售部 |
3 | 营销部 |
此时员工表的部门字段就是一个外键,我们通常把部门表称作母表,而员工表称作子表。在SQL中我们可以在创建的时候添加外键,或者创建后添加外键,代码如下:
CREATE TABLE EMP
(
Id int PRIMARY KEY,
NAME varchar(10) NOT NULL,
PARTY_ID int,
FOREIGN KEY (Id ) REFERENCES PARTY(Id)
)
特别的,在创建表后添加外键的代码如下:
ALTER TABLE EMP ADD CONSTRAINT FOREIGN_PARTY FOREIGN KEY (Id) REFERENCES PARTY(Id);
与此同时我们也可以撤销外键的约束,代码如下:
ALTER TABLE Orders DROP FOREIGN KEY FOREIGN_PARTY;
当我们对表的某字段设定了外键时,删除外键中的数据通常是不允许的,假如我们希望外键的数据改变时在子表的操作发生改变,可以使用不同的行为对外键的更新或者删除做限定,行为分为以下几类:
行为 | 说明 |
---|---|
NO ACTION | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 RESTRICT 一致) |
RESTRICT | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 NO ACTION一致 |
CASCADE | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。 |
SETNULL | 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为ull(这就要求该外键允许取nul)。 |
SETDEFAULT | 父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持) |
设顶外键更新或删除行为的语句如下所示: |
# 对EMP表中的Id设置外键PARTY表中的Id
# 在更新PARTY表中的内容时检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
# 在删除PARTY表中的内容时首先检查该记录是否有对应外键,如果有则设置子表中该外键值为ull(这就要求该外键允许取nul)。
ALTER TABLE EMP ADD CONSTRAINT FOREIGN_PARTY FOREIGN KEY (Id) REFERENCES PARTY(Id) ON UPDATE CASCADE ON DELETE SET NULL;
本次列举了SQL中常用约束相关语句,在实际学习的过程中还需要多学习以及使用才能熟练掌握。
余下的SQL内容我也将持续更新,如果感兴趣的话不妨订阅本专栏或者点个关注,我们下次再见。