阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL约束

328次阅读
没有评论

共计 18712 个字符,预计需要花费 47 分钟才能阅读完成。

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

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

一、约束概述

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

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

如:

MySQL 约束

注意:

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

员工表

MySQL 约束

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

问题解决

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

MySQL 约束

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

新的问题?

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

MySQL 约束

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

实际情况:

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

解决方法:

使用外键约束

7.4、什么是外键约束

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

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

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

MySQL 约束

八、外键约束

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 秒)

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-09发表,共计18712字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7995712
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
终于收到了以女儿为原型打印的3D玩偶了

终于收到了以女儿为原型打印的3D玩偶了

终于收到了以女儿为原型打印的 3D 玩偶了 前些日子参加某网站活动,获得一次实物 3D 打印的机会,于是从众多...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

  星哥带你玩飞牛 NAS-16:不再错过公众号更新,飞牛 NAS 搭建 RSS 对于经常关注多个微...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
2025年11月28日-Cloudflare史诗级事故:一次配置失误,引爆全球宕机

2025年11月28日-Cloudflare史诗级事故:一次配置失误,引爆全球宕机

2025 年 11 月 28 日 -Cloudflare 史诗级事故: 一次配置失误,引爆全球宕机 前言 继今...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集 在云原生体系中,Prometheus 已成为最主流的监控与报警...
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号 AI 知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率 大家好,我是星哥,...