MySQL约束
约束是按照约定(特定)条件限制,管束等意思。约束的作用是添加、删除。
在数据库中对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。
一、约束概述
1.1、什么是约束
约束用于限制加入表的数据的类型。
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。
1.2、约束作用
对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。
1.3、约束分类
主键 primary key
唯一 unique
非空 not null
默认值 default
外键 foreign key
检查约束 check
二、主键约束
2.1、主键约束格式
格式1:
字段名 字段类型 primary key #在create table 语句中设置主键
格式2:
alter table 数据库表名 add primary key(字段名); #在已经创建好的数据库表中增加主键
格式3:
alter table 数据库表名 drop primary key; #在已经创建好的数据库表中删除主键
注意:
非空 not null
唯一
2.2、主键约束作用
是每一条记录的唯一标识,不会重复。
如:
注意:
通常主键,单独给每张表设计一个 id 的字段,把 id 作为主键。
主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。
2.3、主键约束应用
创建一个老师表,里面包含了字段名(tid,tname,sex,age),将tid做为主键
create table teacher(
tid int primary key, -- sid为主键
tname varchar(20),
sex varchar(2),
age int
);
mysql> create table teacher(
tid int primary key, -- sid为主键
tname varchar(20),
sex varchar(2),
age int
);
Query OK, 0 rows affected (0.10 秒)
mysql> desc teacher;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| tid | int(11) | NO | PRI | NULL | |
| tname | varchar(20) | YES | | NULL | |
| sex | varchar(2) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 行于数据集 (0.01 秒)
往老师表中插入记录
#插入记录
mysql> insert into teacher values(1,'李小四','男',45);
Query OK, 1 rows affected (0.08 秒)
#插入相同记录
mysql> insert into teacher values(1,'李小四','男',45);
Duplicate entry '1' for key 'PRIMARY'
mysql> select * from teacher;
+-----+-----------+------+------+
| tid | tname | sex | age |
+-----+-----------+------+------+
| 1 | 李小四 | 男 | 45 |
+-----+-----------+------+------+
1 行于数据集 (0.01 秒)
#插入一条null记录
mysql> insert into teacher values(null,'李小四','男',45);
Column 'tid' cannot be null
去掉老师表中的主键约束
mysql> alter table teacher drop primary key;
Query OK, 1 rows affected (0.07 秒)
mysql> desc teacher;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| tid | int(11) | NO | | NULL | |
| tname | varchar(20) | YES | | NULL | |
| sex | varchar(2) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 行于数据集 (0.01 秒)
为老师表添加主键约束
mysql> alter table teacher add primary key(tid);
Query OK, 0 rows affected (0.25 秒)
mysql> desc teacher;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| tid | int(11) | NO | PRI | NULL | |
| tname | varchar(20) | YES | | NULL | |
| sex | varchar(2) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 行于数据集 (0.02 秒)
三、主键自增
3.1、主键自增格式
在数据库表中,主键一般情况下,我们是用一个id字段来表示,如果让我们自己添加的话要做到不能重复、不能为空就比较麻烦,所以主键我们都是设置为自动增长。
格式:
字段名 字段类型 primary key auto_increment
案例:
创建一个用户表,表里面有用户名和密码
create table user(
uid int primary key auto_increment,
uname varchar(20),
pword varchar(20)
);
在用户表中插入二条件数据
mysql> insert into user(uname,pword)values('zutuanxue01','00001');
Query OK, 1 rows affected (0.06 秒)
mysql> insert into user(uname,pword)values('zutuanxue02','00002');
Query OK, 1 rows affected (0.01 秒)
mysql> select * from user;
+-----+------------+-------+
| uid | uname | pword |
+-----+------------+-------+
| 1 | zutuanxue01 | 00001 |
| 2 | zutuanxue02 | 00002 |
+-----+------------+-------+
2 行于数据集 (0.01 秒)
注意:
设置表字段的自增长后,他的默认起始值从1开始
mysql> insert into user values(null,'zutuanxue03','00003');
Query OK, 1 rows affected (0.03 秒)
mysql> select * from user;
+-----+------------+-------+
| uid | uname | pword |
+-----+------------+-------+
| 1 | zutuanxue01 | 00001 |
| 2 | zutuanxue02 | 00002 |
| 3 | zutuanxue03 | 00003 |
+-----+------------+-------+
3 行于数据集 (0.01 秒)
3.2、修改主键自增起始值
3.2.1、创建表后修改
格式:
alter table 数据库表名 auto_increment=起始值;
案例:
修改用户表中主键自增长的起始值为100
mysql> alter table user auto_increment=100;
Query OK, 0 rows affected (0.05 秒)
mysql> insert into user values(null,'zutuanxue04','00004');
Query OK, 1 rows affected (0.10 秒)
mysql> select * from user;
+-----+------------+-------+
| uid | uname | pword |
+-----+------------+-------+
| 1 | zutuanxue01 | 00001 |
| 2 | zutuanxue02 | 00002 |
| 3 | zutuanxue03 | 00003 |
| 100 | zutuanxue04 | 00004 |
+-----+------------+-------+
4 行于数据集 (0.01 秒)
3.2.2、创建表时修改
格式:
create table 数据库表名(
字段名1 字段类型 primary key auto_increment,
字段名2 字段类型,
...
字段名n 字段类型,
)auto_increment=超始值;
创建一个新用户表,表里面有用户名和密码,并设置起始值为100
create table new_user(
uid int primary key auto_increment,
uname varchar(20),
pword varchar(20)
)auto_increment=100;
在新用户表中插入一条件数据
mysql> insert into new_user(uname,pword)values('zutuanxue01','00001');
Query OK, 1 rows affected (0.10 秒)
mysql> select * from new_user;
+-----+------------+-------+
| uid | uname | pword |
+-----+------------+-------+
| 100 | zutuanxue01 | 00001 |
+-----+------------+-------+
1 行于数据集 (0.01 秒)
3.3、记录删除后对自增的影响
3.3.1、delete
删除记录后,对自增长字段没有影响
案例:
删除用户数据库表中的所有记录,在插入1条记录
mysql> delete from user;
Query OK, 4 rows affected (0.11 秒)
mysql> insert into user values(null,'zhangsan','zhangsan');
Query OK, 1 rows affected (0.05 秒)
mysql> select * from user;
+-----+----------+----------+
| uid | uname | pword |
+-----+----------+----------+
| 101 | zhangsan | zhangsan |
+-----+----------+----------+
1 行于数据集 (0.01 秒)
3.3.2、truncate
删除记录后,自增长字段重新从1开始
案例:
删除用户数据库表中的所有记录,在插入1条记录
mysql> truncate user;
Query OK, 0 rows affected (0.02 秒)
mysql> insert into user values(null,'zhangsan','zhangsan');
Query OK, 1 rows affected (0.05 秒)
mysql> select * from user;
+-----+----------+----------+
| uid | uname | pword |
+-----+----------+----------+
| 1 | zhangsan | zhangsan |
+-----+----------+----------+
1 行于数据集 (0.01 秒)
mysql> truncate new_user;
Query OK, 0 rows affected (0.06 秒)
mysql> insert into new_user values(null,'zhangsan','zhangsan');
Query OK, 1 rows affected (0.04 秒)
mysql> select * from new_user;
+-----+----------+----------+
| uid | uname | pword |
+-----+----------+----------+
| 1 | zhangsan | zhangsan |
+-----+----------+----------+
1 行于数据集 (0.01 秒)
四、唯一约束
唯一约束就是:设计表中的某一个字段不能出现重复的记录
4.1、唯一约束格式
字段名 字段类型 unique #在create table 语句中设置唯一约束
4.2、唯一约束应用
4.2.1、插入相同记录
案例:
创建一个新的表t1,表里包含字段名(id,name)
create table t1(
id int,
name varchar(20) unique -- 姓名唯一,不能出现重复
);
往表中插入一条记录
mysql> insert into t1 values(1,'zhangsan');
Query OK, 1 rows affected (0.08 秒)
继续插入同一条件记录
mysql> insert into t1 values(1,'zhangsan');
Duplicate entry 'zhangsan' for key 'name'
4.2.1、插入null记录
案例:
mysql> insert into t1 values(1,null);
Query OK, 1 rows affected (0.02 秒)
mysql> insert into t1 values(1,null);
Query OK, 1 rows affected (0.05 秒)
mysql> select * from t1;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 1 | NULL |
| 1 | NULL |
+------+----------+
3 行于数据集 (0.01 秒)
注意:
null表示的是没有数据,所有不存在重复的问题
五、非空约束
非空约束就是:数据库表中的字段的值,不能为null
5.1、非空约束格式
字段名 字段类型 not null #在create table 语句中设置字段值不能为null
5.2、非空约束应用
案例:
创建一个新的表t2,表里包含字段名(id,name)
create table t2(
id int,
name varchar(20) not null -- 姓名的记录不能为null
);
往表中插入一条记录
mysql> insert into t2 values(1,'lisi');
Query OK, 1 rows affected (0.10 秒)
往表中插入一条姓名为null的记录
mysql> insert into t2 values(1, null);
Column 'name' cannot be null
mysql> select * from t2;
+------+------+
| id | name |
+------+------+
| 1 | lisi |
+------+------+
1 行于数据集 (0.01 秒)
注意:
字段设置了非空与唯一约束与主键区别?
主键数在一个表中,只能有一个。自增长只能用在主键上
非空与唯一约束可以设置在N个字段上
六、默认值
默认值就是:当我们在增加记录的时候如果不去设置值,那么自动的会用默认值补齐,字段默认的默认值是null
6.1、默认值格式
字段名 字段类型 default 默认值 #在create table 语句中设置字段的默认值,不设置默认值为null
6.2、默认值应用
案例:
创建一个新的表t3,表里包含字段名(id,name)
create table t3(
id int,
name varchar(20) default 'lisi' -- 增加时如果不加入姓名,姓名为‘lisi’
);
往表中插入一条记录
mysql> insert into t3 values(1,'zhangsan');
Query OK, 1 rows affected (0.03 秒)
往表中插入一条id为1的记录,其他信息不用增加
方法一:
mysql> insert into t3(id) values(1);
Query OK, 1 rows affected (0.06 秒)
mysql> select * from t3;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 1 | lisi |
+------+----------+
2 行于数据集 (0.01 秒)
方法二:
mysql> insert into t3 values(1,default);
Query OK, 1 rows affected (0.09 秒)
mysql> select * from t3;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 1 | lisi |
| 1 | lisi |
+------+----------+
3 行于数据集 (0.01 秒)
七、外键约束产生
7.1、数据冗余
数据冗余是指数据之间的重复,也可以说是同一数据存储在不同数据文件中的现象。
7.2、表的数据冗余
员工表
除了数据冗余的问题外,假如我们的研发部搬到了北京,这这时候,我们就要去修改我们的研发部的地点,这样的修改数据的时候也会很麻烦。
问题解决
数据冗余、数据增、删、改?
7.3、为什么要使用外键约束
新的问题?
假如我们在员工表中增加一条记录
员工表中的记录dep_id中的3,在部门表中并没有这个id的记录。我们也将这条记录加入了进去。那么我们的员工王六就没有对应的部门了。这种情况在实际的应用中是不允许的。
实际情况:
我们员工表中的dep_id的值,只能是部门表中存在的id。
解决方法:
使用外键约束
7.4、什么是外键约束
一张表的一个字段受限于另外一张表的一个字段对应的值。这里涉及到两张表:被引用的表叫主表(父表),另外一张叫从表(子表)。
子表:定义了外键的表,外键的取值要么取父表中字段对应的值,要么取NULL值,严重受限于父表
父表:被引用的字段要具有唯一性(绝大多数都是用的父表的主键)
八、外键约束
8.1、外键约束格式
格式一:
[constraint][外键约束名称] foreign key(外键字段名) references 主表名称(主键字段名); #在create table时设置
案例:
创建一个班级表:
create table classes( -- 班级表
cid int primary key auto_increment,-- 班级ID
cname varchar(20),-- 班级名称
crenshu int(3),-- 班级人数
cmajor varchar(10),-- 专业
cmark text -- 备注
);
mysql> desc classes;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| cid | int(11) | NO | PRI | NULL | auto_increment |
| cname | varchar(20) | YES | | NULL | |
| crenshu | int(3) | YES | | NULL | |
| cmajor | varchar(10) | YES | | NULL | |
| cmark | text | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
5 行于数据集 (0.01 秒)
插入班级信息:
mysql> insert into classes values(null,'一班',60,'计算机','学校的王牌专业'),(null,'二班',50,'财务会计','学校最好就业专业');
Query OK, 2 rows affected (0.06 秒)
mysql> select * from classes;
+-----+--------+---------+--------------+--------------------------+
| cid | cname | crenshu | cmajor | cmark |
+-----+--------+---------+--------------+--------------------------+
| 3 | 一班 | 60 | 计算机 | 学校的王牌专业 |
| 4 | 二班 | 50 | 财务会计 | 学校最好就业专业 |
+-----+--------+---------+--------------+--------------------------+
2 行于数据集 (0.01 秒)
创建一个学生表(与班级表建立主外键关联):
create table stu -- 学生表
(
sid int primary key auto_increment, -- 学生ID
sname varchar(20),-- 学生姓名
ssex varchar(2),-- 性别
stell varchar(11),-- 电话号码
sdate date ,-- 入学日期
srmark varchar(30),-- 备注
sclassid int,-- 外键对应主表中的主建
-- 创建外键约束
constraint stu_sclassid_fk foreign key (sclassid) references classes(cid)
);
mysql> desc stu;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| sid | int(11) | NO | PRI | NULL | auto_increment |
| sname | varchar(20) | YES | | NULL | |
| ssex | varchar(2) | YES | | NULL | |
| stell | varchar(11) | YES | | NULL | |
| sdate | date | YES | | NULL | |
| srmark | varchar(30) | YES | | NULL | |
| sclassid | int(11) | YES | MUL | NULL | |
+----------+-------------+------+-----+---------+----------------+
7 行于数据集 (0.01 秒)
注意:
PRI主键约束; UNI唯一约束; MUL可以重复。
插入学生信息:
mysql> insert into stu values(null,'张三','男','13111111111','2019-09-01','学习成绩不错',3);
Query OK, 1 rows affected (0.03 秒)
mysql> insert into stu values(null,'李四','男','13112211112','2019-09-01','学习成绩一般',1);
Cannot add or update a child row: a foreign key constraint fails (`zutuanxue`.`stu`, CONSTRAINT `stu_sclassid_fk` FOREIGN KEY (`sclassid`) REFERENCES `classes` (`cid`))
mysql> select * from stu;
+-----+--------+------+-------------+------------+--------------------+----------+
| sid | sname | ssex | stell | sdate | srmark | sclassid |
+-----+--------+------+-------------+------------+--------------------+----------+
| 1 | 张三 | 男 | 13111111111 | 2019-09-01 | 学习成绩不错 | 3 |
+-----+--------+------+-------------+------------+--------------------+----------+
1 行于数据集 (0.02 秒)
格式二:
alter table 从表名称 add [constraint][外键约束名称] foreign key(外键字段名) references 主表名称(主键字段名); #建好表后修改
案例:
创建一个学生表:
create table stu1 -- 学生表
(
sid int primary key auto_increment, -- 学生ID
sname varchar(20),-- 学生姓名
ssex varchar(2),-- 性别
stell varchar(11),-- 电话号码
sdate date ,-- 入学日期
srmark varchar(30),-- 备注
sclassid int -- 外键对应主表中的主建
);
mysql> desc stu1;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| sid | int(11) | NO | PRI | NULL | auto_increment |
| sname | varchar(20) | YES | | NULL | |
| ssex | varchar(2) | YES | | NULL | |
| stell | varchar(11) | YES | | NULL | |
| sdate | date | YES | | NULL | |
| srmark | varchar(30) | YES | | NULL | |
| sclassid | int(11) | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
7 行于数据集 (0.02 秒)
为我们的学生表stu1加入我们的外键约束
mysql> alter table stu1 add constraint stu_sclassid_fk1
foreign key (sclassid) references classes(cid);
Query OK, 0 rows affected (0.05 秒)
mysql> desc stu1;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| sid | int(11) | NO | PRI | NULL | auto_increment |
| sname | varchar(20) | YES | | NULL | |
| ssex | varchar(2) | YES | | NULL | |
| stell | varchar(11) | YES | | NULL | |
| sdate | date | YES | | NULL | |
| srmark | varchar(30) | YES | | NULL | |
| sclassid | int(11) | YES | MUL | NULL | |
+----------+-------------+------+-----+---------+----------------+
7 行于数据集 (0.02 秒)
插入学生信息:
mysql> insert into stu1 values(null,'张三','男','13111111111','2019-09-01','学习成绩不错',3);
Query OK, 1 rows affected (0.07 秒)
mysql> insert into stu1 values(null,'李四','男','13112211112','2019-09-01','学习成绩一般',1);
Cannot add or update a child row: a foreign key constraint fails (`zutuanxue`.`stu1`, CONSTRAINT `stu_sclassid_fk1` FOREIGN KEY (`sclassid`) REFERENCES `classes` (`cid`))
mysql> select * from stu1;
+-----+--------+------+-------------+------------+--------------------+----------+
| sid | sname | ssex | stell | sdate | srmark | sclassid |
+-----+--------+------+-------------+------------+--------------------+----------+
| 1 | 张三 | 男 | 13111111111 | 2019-09-01 | 学习成绩不错 | 3 |
+-----+--------+------+-------------+------------+--------------------+----------+
1 行于数据集 (0.01 秒)
8.2、删除外键约束
格式:
alter table 从表 drop foreign key 外键约束名称;
案例:
删除stu1中的外表关联
mysql> alter table stu1 drop foreign key stu_sclassid_fk1;
Query OK, 0 rows affected (0.05 秒)
mysql> desc stu1;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| sid | int(11) | NO | PRI | NULL | auto_increment |
| sname | varchar(20) | YES | | NULL | |
| ssex | varchar(2) | YES | | NULL | |
| stell | varchar(11) | YES | | NULL | |
| sdate | date | YES | | NULL | |
| srmark | varchar(30) | YES | | NULL | |
| sclassid | int(11) | YES | MUL | NULL | |
+----------+-------------+------+-----+---------+----------------+
7 行于数据集 (0.02 秒)
插入数据
mysql> insert into stu1 values(null,'李四','男','13112211112','2019-09-01','学习成绩一般',1);
Query OK, 1 rows affected (0.04 秒)
mysql> select * from stu1;
+-----+--------+------+-------------+------------+--------------------+----------+
| sid | sname | ssex | stell | sdate | srmark | sclassid |
+-----+--------+------+-------------+------------+--------------------+----------+
| 1 | 张三 | 男 | 13111111111 | 2019-09-01 | 学习成绩不错 | 3 |
| 3 | 李四 | 男 | 13112211112 | 2019-09-01 | 学习成绩一般 | 1 |
+-----+--------+------+-------------+------------+--------------------+----------+
2 行于数据集 (0.01 秒)
九、级联操作
9.1、为什么要级联
当我们的主表班级表中的cid发生变化时,我们应该如何去改变我们的从表学生表中的sclassid?这个时候我们就需要级联。
mysql> delete from classes;
Cannot delete or update a parent row: a foreign key constraint fails (`zutuanxue`.`stu`, CONSTRAINT `stu_sclassid_fk` FOREIGN KEY (`sclassid`) REFERENCES `classes` (`cid`))
mysql> delete from classes where cid=3;
Cannot delete or update a parent row: a foreign key constraint fails (`zutuanxue`.`stu`, CONSTRAINT `stu_sclassid_fk` FOREIGN KEY (`sclassid`) REFERENCES `classes` (`cid`))
mysql> update classes set cid=1 where cid=3;
Cannot delete or update a parent row: a foreign key constraint fails (`zutuanxue`.`stu`, CONSTRAINT `stu_sclassid_fk` FOREIGN KEY (`sclassid`) REFERENCES `classes` (`cid`))
9.2、级联是什么
在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作。
级联操作分为二种:级联更新、级联删除
9.2、级联操作方式
格式:
on update cascade #级联更新
on delete cascade #级联操作
只能是创建表的时候创建级联关系。更新主表中的主键,从表中的外键列也自动同步更新
案例:
创建一个学生表(与班级表建立主外键关联,并加入级联操作)
create table stu -- 学生表
(
sid int primary key auto_increment, -- 学生ID
sname varchar(20),-- 学生姓名
ssex varchar(2),-- 性别
stell varchar(11),-- 电话号码
sdate date ,-- 入学日期
srmark varchar(30),-- 备注
sclassid int,-- 外键对应主表中的主建
-- 创建外键约束
constraint stu_sclassid_fk foreign key (sclassid) references classes(cid) on update cascade on delete cascade
);
在学生表中插入数据
mysql> insert into stu values(null,'张三','男','13111111111','2019-09-01','学习成绩不错',3);
Query OK, 1 rows affected (0.11 秒)
mysql> insert into stu values(null,'李四','男','13112211112','2019-09-01','学习成绩一般',4);
Query OK, 1 rows affected (0.08 秒)
mysql> select * from stu;
+-----+--------+------+-------------+------------+--------------------+----------+
| sid | sname | ssex | stell | sdate | srmark | sclassid |
+-----+--------+------+-------------+------------+--------------------+----------+
| 1 | 张三 | 男 | 13111111111 | 2019-09-01 | 学习成绩不错 | 3 |
| 2 | 李四 | 男 | 13112211112 | 2019-09-01 | 学习成绩一般 | 4 |
+-----+--------+------+-------------+------------+--------------------+----------+
2 行于数据集 (0.01 秒)
修改我们班级表中的主键
mysql> select * from classes;
+-----+--------+---------+--------------+--------------------------+
| cid | cname | crenshu | cmajor | cmark |
+-----+--------+---------+--------------+--------------------------+
| 3 | 一班 | 60 | 计算机 | 学校的王牌专业 |
| 4 | 二班 | 50 | 财务会计 | 学校最好就业专业 |
+-----+--------+---------+--------------+--------------------------+
2 行于数据集 (0.01 秒)
mysql> update classes set cid=1 where cid=3;
Query OK, 1 rows affected (0.06 秒)
mysql> select * from classes;
+-----+--------+---------+--------------+--------------------------+
| cid | cname | crenshu | cmajor | cmark |
+-----+--------+---------+--------------+--------------------------+
| 1 | 一班 | 60 | 计算机 | 学校的王牌专业 |
| 4 | 二班 | 50 | 财务会计 | 学校最好就业专业 |
+-----+--------+---------+--------------+--------------------------+
2 行于数据集 (0.01 秒)
mysql> select * from stu;
+-----+--------+------+-------------+------------+--------------------+----------+
| sid | sname | ssex | stell | sdate | srmark | sclassid |
+-----+--------+------+-------------+------------+--------------------+----------+
| 1 | 张三 | 男 | 13111111111 | 2019-09-01 | 学习成绩不错 | 1 |
| 2 | 李四 | 男 | 13112211112 | 2019-09-01 | 学习成绩一般 | 4 |
+-----+--------+------+-------------+------------+--------------------+----------+
2 行于数据集 (0.01 秒)
删除我们班级表中的主键
mysql> delete from classes where cid=4;
Query OK, 1 rows affected (0.01 秒)
mysql> select * from classes;
+-----+--------+---------+-----------+-----------------------+
| cid | cname | crenshu | cmajor | cmark |
+-----+--------+---------+-----------+-----------------------+
| 1 | 一班 | 60 | 计算机 | 学校的王牌专业 |
+-----+--------+---------+-----------+-----------------------+
1 行于数据集 (0.01 秒)
mysql> select * from stu;
+-----+--------+------+-------------+------------+--------------------+----------+
| sid | sname | ssex | stell | sdate | srmark | sclassid |
+-----+--------+------+-------------+------------+--------------------+----------+
| 1 | 张三 | 男 | 13111111111 | 2019-09-01 | 学习成绩不错 | 1 |
+-----+--------+------+-------------+------------+--------------------+----------+
1 行于数据集 (0.01 秒)
十、检查约束
10.1、什么是检查约束
检查约束指定某列中的值必须满足布尔表达式,根据用户自己的需求来进行限制。
10.2、检查约束使用
10.2.1、行级添加
格式:
create table 表名
(
check (字段名1 != 字段名1),
字段名1 字段类型 check (表达式),
字段名2 字段类型 constraint 唯一约束名 check (表达式) [not enforced]
);
注意:
表达式中可以包含该字段名: 字段名 > 0
表达式注意事项
1.允许使用文字,内置函数和运算符
2.不允许在使用了auto_increment的列上使用
3.不允许存储函数和用户定义的函数
4.不允许子查询等
如果省略或指定为enforced,则创建并强制执行约束。
如果指定为not enforced,则创建约束但不强制执行。
案例:
创建一个表t4
create table t4
(
id int primary key auto_increment,
username varchar(32),
phone varchar(11) check(length(phone) =11)
);
插入数据
mysql> insert into t4 values(null,'zhangsan','13812221222');
Query OK, 1 rows affected (0.01 秒)
mysql> insert into t4 values(null,'zhangsan','1381222125');
Check constraint 't4_chk_1' is violated.
10.2.2、表级添加
格式:
create table 表名
(
字段名1 字段类型,
字段名2 字段类型,
[constraint 检查约束名] check(布尔表达式) [ not enforced]
);
案例:
创建一个表t5
create table t5
(
id int primary key auto_increment,
username varchar(32),
phone varchar(11),
constraint t5_check_phone check(length(phone) =11)
);
插入数据
mysql> insert into t5 values(null,'zhangsan','13812222222');
Query OK, 1 rows affected (0.01 秒)
mysql> insert into t5 values(null,'zhangsan','1381222222');
Check constraint 't4_check_phone' is violated.
10.2.3、表后添加
格式:
alter table 数据库表名 add constraint 检查约束名 check(检查约束);
案例:
创建一个表t6
create table t6
(
id int primary key auto_increment,
username varchar(32),
phone varchar(11)
);
mysql> alter table t6 add constraint t6_check_phone check(length(phone)=11);
Query OK, 0 rows affected (0.09 秒)
插入数据
mysql> insert into t6 values(null,'zhangsan','13812221222');
Query OK, 1 rows affected (0.01 秒)
mysql> insert into t6 values(null,'zhangsan','1381222125');
Check constraint 't6_check_phone' is violated.
10.2.4、约束删除
格式:
alter table 数据库表名 drop check 检查约束名;
案例:
删除t6表中的检查约束t6_check_phone
mysql> alter table t6 drop check t6_check_phone;
Query OK, 0 rows affected (0.02 秒)
插入数据
mysql> insert into t6 values(null,'zhangsan','1381222125');
Query OK, 1 rows affected (0.01 秒)