服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySQL数据库的约束使用实例

MySQL数据库的约束使用实例

2022-12-06 15:42敲代码の流川枫 Mysql

约束是用来限制表中的数据长什么样子的,即什么样的数据可以插入到表中,什么样的数据插入不到表中,下面这篇文章主要给大家介绍了关于如何通过一文理解MySQL数据库的约束与表的设计的相关资料,需要的朋友可以参考下

数据库的约束就是关系型数据库给我们提供的一种"校验数据"合法性的机制

1. NULL约束

创建表时,可以指定某列不为空

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create table student(
    id int not null,
    sn int,
    name varchar(20),
    qq_mail varchar(20)
);
mysql> desc student;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   |     | NULL    |       |
| sn      | int(11)     | YES  |     | NULL    |       |
| name    | varchar(20) | YES  |     | NULL    |       |
| qq_mail | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

2. UNIQUE(唯一约束)

保证某列的每行必须有唯一的值

重新设置一下表的结构

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create table student1(
    id int not null,
    sn int unique,
    name varchar(20),
    qq_mail varchar(20)
);
mysql> desc student1;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   |     | NULL    |       |
| sn      | int(11)     | YES  | UNI | NULL    |       |
| name    | varchar(20) | YES  |     | NULL    |       |
| qq_mail | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

表示sn这列的值时唯一的不重复的

3. DEFAULT(默认值约束)

规定没有给列赋值时的默认值

指定插入数据时,name列为空,默认值unkown

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create table student2(
    id int not null,
    sn int unique,
    name varchar(20) default 'unkown',
    qq_mail varchar(20)
);
mysql> desc student2;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   |     | NULL    |       |
| sn      | int(11)     | YES  | UNI | NULL    |       |
| name    | varchar(20) | YES  |     | unkown  |       |
| qq_mail | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

插入一个id但不插入name时:

?
1
2
3
4
5
6
7
8
insert into student2 (id) values (1);
mysql> select*from student2;
+----+------+--------+---------+
| id | sn   | name   | qq_mail |
+----+------+--------+---------+
|  1 | NULL | unkown | NULL    |
+----+------+--------+---------+
1 row in set (0.00 sec)

name是默认值

4. PRIMARY KEY(主键约束)

NOT NULL 和 UNIQUE 的结合

确保某列有唯一标识,有助于快速找到表中的一个特定记录

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create table student3(
    id int not null primary key,
    sn int unique,
    name varchar(20) default 'unkown',
    qq_mail varchar(20)
);
mysql> desc student3;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   | PRI | NULL    |       |
| sn      | int(11)     | YES  | UNI | NULL    |       |
| name    | varchar(20) | YES  |     | unkown  |       |
| qq_mail | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

主键是not null 和 unique 的结合,也可以不用 not null

id int primary key

对于整数类型的主键,例如id,常搭配自增长auto_increment来使用

当插入数据对应字段不给定值时,使用最大值加一

?
1
2
3
4
5
6
mysql> create table student4(
    id int primary key auto_increment,
    sn int unique,
    name varchar(20) default 'unkown',
    qq_mail varchar(20)
);

接下来我们插入记录时,id为null

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> insert into student4 values (null,1000,'zhangsan',null);
Query OK, 1 row affected (0.00 sec)
mysql> insert into student4 values (null,1001,'zhangsi',null);
Query OK, 1 row affected (0.00 sec)
//将id置为100
insert into student4 values(100,1002,'zhangwu',null);
//将id置为null
insert into student4 values(null,1003,'zhangliu',null);
结果
mysql> select *from student4;
+-----+------+----------+---------+
| id  | sn   | name     | qq_mail |
+-----+------+----------+---------+
|   1 | 1000 | zhangsan | NULL    |
|   2 | 1001 | zhangsi  | NULL    |
| 100 | 1002 | zhangwu  | NULL    |
| 101 | 1003 | zhangliu | NULL    |
+-----+------+----------+---------+
4 rows in set (0.00 sec)

可以看出,使用自增长之后,插入数据给值时,用给定的值插入,插入数据不给值时,默认插入最近一次的最大值+1

5. FOREIGN KEY(外键约束)

保证一个表中的数据匹配另一个表中的值的参照完整性

创建一个班级表class,id为主键.

创建学生表student,一个学生对应一个班级,一个班级对应多个学生。使用id为主键, classes_id为外键,关联班级表id

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create table class(
    id int primary key,
    name varchar(20),
    `desc` VARCHAR(100)
);
Query OK, 0 rows affected (0.03 sec)
mysql> desc class;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   | PRI | NULL    |       |
| name  | varchar(20)  | YES  |     | NULL    |       |
| desc  | varchar(100) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
create table student5(
    id int primary key auto_increment,
    sn int unique,name varchar(20) default 'unknow',
    qq_mail varchar(20),
    class_id int,
    foreign key(class_id) references class(id)
);
Query OK, 0 rows affected (0.03 sec)
mysql> desc student5;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| sn       | int(11)     | YES  | UNI | NULL    |                |
| name     | varchar(20) | YES  |     | unknow  |                |
| qq_mail  | varchar(20) | YES  |     | NULL    |                |
| class_id | int(11)     | YES  | MUL | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

此时学生表就和班级表关联起来了

外键约束是两个表之间的相互约束

MySQL数据库的约束使用实例

我们插入一个非法数据,现在class的id列还是空的,插任何数据都会不合法

?
1
2
3
4
5
insert into student5 values(1,1001,'张三',null,10);
ERROR 1452 (23000): Cannot add or update a child row:
     a foreign key constraint fails (`java_3`.`student5`,
     CONSTRAINT `student5_ibfk_1` FOREIGN KEY (`class_id`)
    REFERENCES `class` (`id`))

插入失败,因为class的id列没有10这个数据

说明学生表中的数据依赖于班级表的数据,班级表的数据对学生表的数据产生约束力,班级表为父表,学生表为子表

我们先给班级表和学生表插入数据

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> insert into class values(1,'java001',null);
Query OK, 1 row affected (0.00 sec)
mysql> insert into student5 values(1,1001,'张三',null,1);
Query OK, 1 row affected (0.00 sec)
mysql> select*from class;
+----+---------+------+
| id | name    | desc |
+----+---------+------+
|  1 | java001 | NULL |
+----+---------+------+
1 row in set (0.00 sec)
mysql> select*from student5;
+----+------+------+---------+----------+
| id | sn   | name | qq_mail | class_id |
+----+------+------+---------+----------+
|  1 | 1001 | 张三 | NULL    |        1 |
+----+------+------+---------+----------+
1 row in set (0.00 sec)

因为数据都是合法的,所以成功插入

下面举例说明子表也会反过来约束父表

?
1
2
3
4
5
6
mysql> delete from class where id = 1;
ERROR 1451 (23000):
Cannot delete or update a parent row:
    a foreign key constraint fails (`java_3`.`student5`,
    CONSTRAINT `student5_ibfk_1` FOREIGN KEY (`class_id`)
    REFERENCES `class` (`id`))

当我们删除班级表中的数据时,发现删除失败

原因是班级表的数据被学生表给引用了,如果删除成功,那么子表的数据就没有意义了

因此父表的数据被引用时,是不能删除的,如果要删除,就先删除子表后删除父表

到此这篇关于MySQL数据库的约束使用实例的文章就介绍到这了,更多相关MySQL数据库的约束内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/chenchenchencl/article/details/127958841

延伸 · 阅读

精彩推荐
  • MysqlMYSQL索引无效和索引有效的详细介绍

    MYSQL索引无效和索引有效的详细介绍

    MYSQL索引无效和索引有效的详细介绍,需要的朋友可以参考一下 ...

    MYSQL教程网4272019-12-25
  • MysqlMysql优化神器(推荐)

    Mysql优化神器(推荐)

    这篇文章主要介绍了Mysql优化神器(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编...

    Sunshine-松9452021-03-22
  • MysqlCentOS 7搭建多实例MySQL8的详细教程(想要几个搞几个)

    CentOS 7搭建多实例MySQL8的详细教程(想要几个搞几个)

    这篇文章主要介绍了CentOS 7搭建多实例MySQL8的详细教程(想要几个搞几个),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定...

    FqGump9262021-01-19
  • MysqlMySql增加用户、授权、修改密码等语句

    MySql增加用户、授权、修改密码等语句

    MySql 新建用户,新建数据库,用户授权,删除用户,修改密码的sql语句分享....

    mysql教程网7942019-10-24
  • MysqlMySQL 覆盖索引的优点

    MySQL 覆盖索引的优点

    当索引包含了所有查询的数据时,这个索引就称之为覆盖索引。覆盖索引能够成为一个非常有力的工具并且能够显著改善性能,本文将具体讲述覆盖索引的...

    岛上码农4202021-07-18
  • MysqlMySQL数据库学习之排序与单行处理函数详解

    MySQL数据库学习之排序与单行处理函数详解

    这篇文章主要为大家详细介绍一下MySQL数据库中排序与单行处理函数的使用,文中的示例代码讲解详细,对我们学习MySQL有一定帮助,需要的可以参考一下...

    世界尽头与你3812022-07-24
  • Mysql开启MySQL的binlog日志的方法步骤

    开启MySQL的binlog日志的方法步骤

    这篇文章主要介绍了开启MySQL的binlog日志的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    jhappyfly12002021-04-26
  • MysqlMySQL定期分析检查与优化表的方法小结

    MySQL定期分析检查与优化表的方法小结

    听DBA的人说,相比oracle,MySQL就是一个玩具级别的数据库,在网易门户中,DBA基本很少去管理到MySQL的东西,所以我们产品使用到的MySQL的一些配置和优化还...

    MYSQL教程网3892020-04-07