组团学

MySQL约束

阅读 (202650)

约束是按照约定(特定)条件限制,管束等意思。约束的作用是添加、删除。

在数据库中对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。

一、约束概述

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、主键约束作用

是每一条记录的唯一标识,不会重复。

如:

image20200210091102251.png

注意:

通常主键,单独给每张表设计一个 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、表的数据冗余

员工表

image20200213223102058.png

除了数据冗余的问题外,假如我们的研发部搬到了北京,这这时候,我们就要去修改我们的研发部的地点,这样的修改数据的时候也会很麻烦。

问题解决

数据冗余、数据增、删、改?

image20200213224403897.png

7.3、为什么要使用外键约束

新的问题?

假如我们在员工表中增加一条记录

image20200213225528342.png

员工表中的记录dep_id中的3,在部门表中并没有这个id的记录。我们也将这条记录加入了进去。那么我们的员工王六就没有对应的部门了。这种情况在实际的应用中是不允许的。

实际情况:

我们员工表中的dep_id的值,只能是部门表中存在的id。

解决方法:

使用外键约束

7.4、什么是外键约束

一张表的一个字段受限于另外一张表的一个字段对应的值。这里涉及到两张表:被引用的表叫主表(父表),另外一张叫从表(子表)。

**子表:**定义了外键的表,外键的取值要么取父表中字段对应的值,要么取NULL值,严重受限于父表

**父表:**被引用的字段要具有唯一性(绝大多数都是用的父表的主键)

image20200213230844619.png

八、外键约束

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 秒)
需要 登录 才可以提问哦