MySQL数据库的约束使用实例
作者:敲代码の流川枫 发布时间:2024-01-17 04:36:57
数据库的约束就是关系型数据库给我们提供的一种"校验数据"合法性的机制
1. NULL约束
创建表时,可以指定某列不为空
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(唯一约束)
保证某列的每行必须有唯一的值
重新设置一下表的结构
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
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时:
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 的结合
确保某列有唯一标识,有助于快速找到表中的一个特定记录
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来使用
当插入数据对应字段不给定值时,使用最大值加一
mysql> create table student4(
id int primary key auto_increment,
sn int unique,
name varchar(20) default 'unkown',
qq_mail varchar(20)
);
接下来我们插入记录时,id为null
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
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)
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)
此时学生表就和班级表关联起来了
外键约束是两个表之间的相互约束
我们插入一个非法数据,现在class的id列还是空的,插任何数据都会不合法
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这个数据
说明学生表中的数据依赖于班级表的数据,班级表的数据对学生表的数据产生约束力,班级表为父表,学生表为子表
我们先给班级表和学生表插入数据
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)
因为数据都是合法的,所以成功插入
下面举例说明子表也会反过来约束父表
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`))
当我们删除班级表中的数据时,发现删除失败
原因是班级表的数据被学生表给引用了,如果删除成功,那么子表的数据就没有意义了
因此父表的数据被引用时,是不能删除的,如果要删除,就先删除子表后删除父表
来源:https://blog.csdn.net/chenchenchencl/article/details/127958841


猜你喜欢
- 前言最近在项目中需要输出彩色的文字来提醒用户,以前写过,但是只能在win上面运行。今天搜了下看有没有在win和Linux上通用的输出彩色文字
- 目录1. 警告不是异常2. 警告能捕获吗3. 捕获警告方法一4. 捕获警告方法二5. 捕获警告方法三1. 警告不是异常你是不是经常在使用一些
- #coding=utf8__author__ = 'Administrator'# 当函数的参数不确定时,可以使用*args
- 一、什么是NumPyNumpy--Numerical Python,是一个基于Python的可以存储和处理大型矩阵的库。几乎是Python
- 最近做的一个B/S项目,在打印时采用了在IE中嵌入.net winform控件和XML结合的方式(参见http://www.yesky.co
- 如下所示:# coding = utf-8import requestsimport jsonhost = "http://47.
- 1. 引言星号* 往往被称为乘法运算符,是所有程序中最为常用的运算符号之一,在Python 中,星号还有很多隐藏的强大功能。本文将用最容易理
- 用div+css制作页面,想实现左右两部分固定宽度,而中间部分不固定,并随着屏幕分辨率的的变化而自动伸缩。大家可知道应该如何实现? &nbs
- 本文主要讲述的是Python中的模块的概念,具体如下。模块是python组织代码的基本方式:python的脚本都是用扩展名为py的文本文件保
- 前端的小伙伴们在babel等的加持下,已经可以愉快的使用es6来写代码了。然后对于服务端的nodejs就有点坑爹了,虽然原生支持了es6,但
- jupyter notebook 图片显示模糊的解决办法加入这几行代码即可:矢量图设置import matplotlib.pyplot as
- 1.在线定制下载echartshttps://echarts.apache.org/zh/builder.html2.创建一个django项
- 看到这个文章肯定一点就是你把sql没有装到C盘里,呵呵不用怕看下面在安装的时候要注意:在安装SQL Server 2005 Express时
- 大多数程序员考虑编程时,他们都要设想用于编写应用程序的 命令式样式和技术。最受欢迎的通用编程语言(包括 Python 和其它面向对象的语言)
- 这篇文章主要介绍了Python如何基于smtplib发不同格式的邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 问题:MySQL 8.0 无法远程连接访问原因:可能是mysql数据库user表中,用户的 host 字段配置是不允许当前hos
- Python字符串处理字符串输入:my_string = raw_input("please input a word:"
- 1. 线程的概念:线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程
- Laravel 中间件提供了一种方便的机制来过滤进入应用的 HTTP 请求。例如,Laravel 内置了一个中间件来验证用户的身份认证。如果
- FSO,正如UFO般令人激动、令人神往,当然更多的亦是让人欢喜让人忧。君不见某空间服务商广告:100MB空间只要60RMB/年,支持数据库,