首页 > 数据库 >MySQL约束

MySQL约束

时间:2023-10-21 15:22:05浏览次数:40  
标签:NULL varchar MySQL Query 约束 mysql affected null

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

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

一、约束概述

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

标签:NULL,varchar,MySQL,Query,约束,mysql,affected,null
From: https://www.cnblogs.com/yihr/p/17779023.html

相关文章

  • mysqldump之where用法
    文档课题:mysqldump之where用法.数据库:MySQL5.7.21应用场景:实际生产中,需要运用mysqldump导出指定条件的数据,并且以insert语句的形式呈现,如下为相关测试.1、数据库信息mysql>select*fromstaffs;+----+------+-----+---------+---------------------+|id|name|age|p......
  • 1130 - Host 'xxx' is not allowed to connect to this MySQL server
    安装mysql-5.7.32数据库时,使用Navicat工具连接数据库时,出现Host'xxx'isnotallowedtoconnecttothisMySQLserver,详情如下: 两种解决方案,任选一个即可:1、修改mysql数据库用户表数据 执行如下SQL命令:usemysql;updateusersethost='%'whereuser......
  • MySQL学习(7)连接的原理
    什么是连接连接就是把各个表中的记录都取出来进行依次匹配。若无过滤条件,连接查询的结果集中包含一个表中的每一条记录与另一个表中的每一条记录相互匹配的组合,这样的结果集称为笛卡尔积。测试数据:CREATETABLEt1(m1INT,n1char(1));CREATETABLEt2(m2INT,n2char(1));......
  • 如何保障MySQL和Redis的数据一致性?
    先抛一下结论:在满足实时性的条件下,不存在两者完全保存一致的方案,只有最终一致性方案。根据网上的众多解决方案,总结出6种,直接看目录:  不好的方案 1、先写MySQL,再写Redis   如图所示: 这是一副时序图,描述请求的先后调用顺序; ......
  • MySQL CASE()用法
    MySQL中的CASE表达式用于根据条件进行条件判断和返回多个可能的值。它允许在查询中执行简单的逻辑判断,并根据不同的条件返回不同的值或执行不同的操作。CASE表达式有两种形式:简单CASE和搜索CASE。简单CASE形式:CASEexpressionWHENvalue1THENresult1WHE......
  • MySQL IF()用法
    MySQL中的IF函数用于根据条件返回两个值中的一个。它可以应用于复杂查询和更新语句中,以便根据条件动态生成值。IF函数的语法如下:IF(condition,value_if_true,value_if_false)其中,condition是一个布尔表达式或一个返回布尔值的函数,value_if_true是条件为TRUE时返回......
  • Mysql FIND_IN_SET()用法
    MySQL中的FIND_IN_SET函数用于在逗号分隔的字符串列表中查找指定字符串的位置。它接受两个参数:要查找的字符串和逗号分隔的字符串列表。语法如下:FIND_IN_SET(string,string_list)其中,string是要查找的字符串,string_list是逗号分隔的字符串列表。返回值为待查找字符串......
  • MySql 关键字 COALESCE
    MySQLCOALESCE()函数用于返回表达式列表中的第一个非空值。如果列表中的所有值均评估为NULL,则COALESCE()函数将返回NULL。COALESCE()函数接受一个参数,该参数是可以包含各种值的列表。MySQLCOALESCE()函数返回的值是表达式列表中的第一个非空值;如果列表中的所有值均为NULL,则为N......
  • MySql Json字段部分查询语法
    模糊匹配jsonObject字段select*fromtableNamewherecolumnName->'$.xx'like'%xx%'精确匹配jsonObject类型字段select*fromtableNamewherecolumnName->'$.xx'='xx'模糊匹配jsonArray字段select*fromtableNamewh......
  • MySQL学习(6)单表访问方法
    什么是访问方法MySQL执行查询语句的方式称为访问方法(accessmethod)。单表的访问方法有哪些const通过主键或唯一二级索引列定位一条记录的方法叫const,这种方法要求主键列或者唯一二级索引列与一个常数进行等值比较时才有效。注意,使用唯一二级索引且搜索条件为ISNULL无效。例......