mysql数据完整性约束包括_MYSQL回顾(完整性约束相关)
简介
MYSQL完整性约束条件主要包括:
auto_increment
not null 和 default
unique
primary key
foreign key
unique、 primary key、not null、default相对简单,本篇文章不做记录。
auto_increment
被指定为自增长的字段必须是key 比如primary key
被指定为自增长的字段默认从1开始,默认步长为1
被指定为自增长的字段在插入数据时可以不指定该字段值.(如下 id为主键为自增长)
mysql> desc article;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| title | varchar(80) | YES | | NULL | |
| createTime | timestamp | YES | | NULL | |
| img | varchar(100) | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
mysql> insert article(title) value("数据结构");
Query OK, 1 row affected (0.01 sec)
了解即可
%模糊匹配查询任意长度任意字符的变量
mysql> show variables like "auto_inc%";
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
2 rows in set (0.00 sec)
auto_increment_increment为自增长步长 默认为1
auto_increment_offset 为自增长的起始偏移量 默认为1即第一条记录的id
设置步长
设置会话级别步长
mysql> set session auto_increment_increment=5;
设置全局级别步长
注意:设置全局级别步长需要退出本次会话再次登录才生效
mysql> set global auto_increment_increment=5;
设置起始偏移量
设置会话级别起始偏移量
mysql> set session auto_increment_offset=3;
设置全局级别起始偏移量
注意:设置全局级别起始偏移量需要退出本次会话再次登录才生效
mysql> set global auto_increment_offset=3;
不连续主键
+----+--------------+------------+
| id | title | createTime |
+----+--------------+------------+
| 1 | NULL | NULL |
| 3 | 操作系统 | NULL |
+----+--------------+——————+
在主键id为1的的记录后面插入了不连贯的一条记录,那么后续自增的记录将是在id为3的基础上自增,即跳过了2;除非手动指定某一条记录的id为2;
mysql> insert into article(title) values("编译原理");
执行上面命令结果如下:
mysql> select * from article;
+----+--------------+------------+
| id | title | createTime |
+----+--------------+------------+
| 1 | NULL | NULL |
| 3 | 操作系统 | NULL |
| 4 | 编译原理 | NULL |
+----+--------------+——————+
可以手动插入id为2的记录:
mysql> insert into article(id, title) values(2, "计算机基础”);
mysql> select * from article;
+----+-----------------+------------+------+
| id | title | createTime | img |
+----+-----------------+------------+------+
| 1 | NULL | NULL | NULL |
| 2 | 计算机基础 | NULL | NULL |
| 3 | 操作系统 | NULL | NULL |
| 4 | 编译原理 | NULL | NULL |
+----+-----------------+------------+------+
foreign key
Foreign key是为了建立表之间的关系,为关联不同的表而生
因为真实的业务中不可能只有一张表。所有的信息都存在于一张表是不是不可以,但是存在于一张表中必然有重复内容,极其浪费空间资源(比如员工和部门,每个员工都有一个对应的部门,一对多关系,有多个员工就要给每个员工分配一个空间存储他的部门信息,相同部门的员工部门信息必然是重复的),也不便于数据统一维护(比如修改某个部门的名字,需要把所有属于该部门的员工记录的部门信息都要修改一遍)
1.创建表
mysql> create table emp(
-> id int not null primary key,
-> name char(10),
-> sex enum('male', 'female'),
-> dep_id int,
-> foreign key(dep_id) references dep(id)
-> );
ERROR 1824 (HY000): Failed to open the referenced table 'dep'
注意:以上创建emp员工表时关联外键失败,外键指向了dep表的id,因为还不存在dep这张部门表,导致关联失败
所以需要先创建被关联的表(dep)再创建关联表(emp)
先创建被关联表(部门表)
mysql> create table dep(
-> id int primary key auto_increment,
-> name char(20)
-> );
Query OK, 0 rows affected (0.02 sec)
再创建关联表(员工表)
mysql> create table emp(
-> id int not null primary key auto_increment,
-> name char(20),
-> sex enum('male', 'female'),
-> dep_id int,
-> foreign key(dep_id) references dep(id)
-> );
Query OK, 0 rows affected (0.02 sec)
注意:外键在被关联表的中一定是唯一的(unique 或 primary key)
需要将dep表中的id设置为唯一 比如 unique 或 primary key,否则会报错
2.插入数据
插入数据的时候先向被关联表中插入记录
再向关联表中插入记录
如果直接向关联表中插入记录,如果外键在被关联表中不存在会导致插入失败
3.删除数据
先删除关联表中的记录
delete from emp where dep_id=1;
再删除被关联表中的记录
delete from dep where id=1;
反过来执行会报错,因为关联表(员工表)中还存在一些记录的外键指向被关联表(部门表),所以直接删除被关联表(部门表)的记录时不合法的。
4.更新数据
强行更新被关联表中的记录的主键也会报错,因为关联表中还存在一些记录的外键指向被关联表
update dep set id=333 where id=3;
解决方案
创建关联表(员工表)的时候增加删除同步和更新同步
on delete cascade
on update cascade
mysql> create table emp(
-> id int not null primary key,
-> name char(10),
-> sex enum('male', 'female'),
-> dep_id int,
-> foreign key(dep_id) references dep(id)
-> on delete cascade
-> on update cascade
-> );
Query OK, 0 rows affected (0.02 sec)
注意:下图红框中换行无逗号 因为同属于一句
image.png
增加了删除同步和更新同步,建表方面:建表时还是需要先建立被关联表再建关联表。插入记录方面:还是要先向被关联表中插入记录,再向关联表中插入记录。
删除同步和更新同步并不解决建表和插入记录操作的先后问题
删除同步是指删除被关联表的记录同步更新关联表
更新同步是指更新被关联表的记录同步更新关联表
增加了删除同步和更新同步后,更新部门表中的记录和删除部门表的记录不再会报错,会同步更新或删除员工表中的记录
尽量不要使用foreign key
建议:尽量不要使用foreign key,foreign key会限制表之间的关系,表之间的关联关系尽量在程序层面去维护,使用代码去维护表之间的这种关联关系(更新同步、删除同步)
设置外键时可以通过constraint给外键起一个名字(可选)
image.png
mysql数据完整性约束包括_MYSQL回顾(完整性约束相关)相关推荐
- mysql 数据表内容_mysql数据库内容相关操作
第一:介绍 mysql数据内容的操作主要是: INSERT实现数据的插入 UPDATE实现数据的更新 DLETE实现数据的删除 SELECT实现数据的查询. 第二:增(insert) 1.插入完整的数 ...
- mysql数据表操作_MySQL数据表基本操作实例详解
本文实例讲述了MySQL数据表基本操作.分享给大家供大家参考,具体如下: 数据表的基本操作 1.主键约束要求主键列的数据唯一,并且不允许为空.主键能够唯一地识别表中的一条记录,可以结合外键来定义不同数 ...
- mysql 数据修改记录日志_mysql对数据的更新操作记录在哪个日志中?
mysql对数据的更新操作记录在通用查询日志和二进制日志中.通用查询日志用来记录用户的所有操作,包括启动和关闭 MySQL 服务.更新语句和查询语句等:二进制日志会以二进制的形式记录数据库的各种操作, ...
- mysql数据转储方法_Mysql数据库各种导出导入数据方式的区别(我的理解错误还望指正)...
mysqldump,NAVICAT转储,select * outfile在千级数据,万级,百万级数据下的表现. 千级数据 mysqldump导出sql文件 导出是出了拒绝访问的错误:为对应目录(.sq ...
- mysql数据排序指令_MySQL 排序 | 菜鸟教程
MySQL 排序 我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据. 如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段 ...
- linux成功mysql数据直接拷贝_mysql数据库数据从一个linux系统移植到另一个linux系统的方法...
背景 问题介绍 现在有一个linux系统的机器上数据需要移植到另外一个linux系统上.老机器称A机器,新机器称B机器. 前期调研 鉴于网上资料很多都是相同内容,而数据库的数据一般都很重要,这些方法都 ...
- php mysql数据备份命令_MySQL数据备份与恢复的相关操作命令
将mysql安装目录设置到系统环境变量中, 方便在命令行终端直接执行.linux下mysql安装后, root默认密码为空, 可直接执行mysql 登录 将mysql安装目录设置到系统环境变量中, 方 ...
- mysql数据表案例_mysql中库和表的简单操作案例
mysql中库和表的简单操作案例 发布时间:2020-12-05 09:54:06 来源:亿速云 阅读:71 作者:小新 这篇文章主要介绍mysql中库和表的简单操作案例,文中介绍的非常详细,具有一定 ...
- 初识mysql数据字段属性_MySQL数据库~~~~初识、基础数据类型
一 数据库初识 1.1 什么是数据库 数据库(DataBase,简称DB),简而言之可视为电子化的文件柜----存储电子文件的处所,用户可以对文件中的数据运行新增,截取,更新,删除等操作. 所谓数据库 ...
最新文章
- python----python使用mysql
- [LeetCode] Plus One - 整数字符转换相加
- QQ卡机问题解决方法
- 【LeetCode笔记】4. 寻找两个正序数组的中位数(Java、二分、递归)
- supervisor简介
- MariaDB 10.3 解决掉了UPDATE不支持同一张表的子查询更新
- OA系统身份认证的设计
- 在Mac OS X中使用VIM开发STM32(3)
- 小程序毕设作品之微信酒店预订小程序毕业设计(6)开题答辩PPT
- 精简版XP安装IIS
- 使用opencv进行车牌提取及识别
- win10安装出现“Windows以保护你的电脑” Micosoft Defender SmartScreen阻止了无法识别的应用启动。运行此应用可能会导致你的电脑存在风险。
- ADB使用及日志分析
- health HEALTH_WARN;352 pgs degraded;352 pgs stuck unclean;352 pgs undersized;recovery 20/40 objects
- Servlet异常处理器
- hypermesh闪退启动解决(最全!!!)
- DevEco studio工具栏的打开与隐藏
- 基于vtkVoxelContoursToSurfaceFilter实现勾画图像的轮廓线面重建
- html的标题题记有哪些,关于温暖的题记唯美
- 打工还是创业?思路决定出路!
热门文章
- ifconfig源代码-NetBSD
- Android的HashMap方法,Android中实现HashMap排序的方法
- niginx之虚拟主机和域名解析
- **python基础类和对象(十二)
- 快速学会php视频,PHP视频从入门到精通---适合PHP初学者
- 【Cinemachine智能相机教程】VirtualCamera(四):Noise属性
- mysql aop_aop: 使用spring aop实现业务层mysql 读写分离
- 利达主机联网接线端子_拾遗●接线端子或连接器(1)
- OpenShift Security (3) - 准备客户端环境和演示应用
- OpenShift 4 之通过ImageTrigger自动构建变化级联镜像