简介

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回顾(完整性约束相关)相关推荐

  1. mysql 数据表内容_mysql数据库内容相关操作

    第一:介绍 mysql数据内容的操作主要是: INSERT实现数据的插入 UPDATE实现数据的更新 DLETE实现数据的删除 SELECT实现数据的查询. 第二:增(insert) 1.插入完整的数 ...

  2. mysql数据表操作_MySQL数据表基本操作实例详解

    本文实例讲述了MySQL数据表基本操作.分享给大家供大家参考,具体如下: 数据表的基本操作 1.主键约束要求主键列的数据唯一,并且不允许为空.主键能够唯一地识别表中的一条记录,可以结合外键来定义不同数 ...

  3. mysql 数据修改记录日志_mysql对数据的更新操作记录在哪个日志中?

    mysql对数据的更新操作记录在通用查询日志和二进制日志中.通用查询日志用来记录用户的所有操作,包括启动和关闭 MySQL 服务.更新语句和查询语句等:二进制日志会以二进制的形式记录数据库的各种操作, ...

  4. mysql数据转储方法_Mysql数据库各种导出导入数据方式的区别(我的理解错误还望指正)...

    mysqldump,NAVICAT转储,select * outfile在千级数据,万级,百万级数据下的表现. 千级数据 mysqldump导出sql文件 导出是出了拒绝访问的错误:为对应目录(.sq ...

  5. mysql数据排序指令_MySQL 排序 | 菜鸟教程

    MySQL 排序 我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据. 如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段 ...

  6. linux成功mysql数据直接拷贝_mysql数据库数据从一个linux系统移植到另一个linux系统的方法...

    背景 问题介绍 现在有一个linux系统的机器上数据需要移植到另外一个linux系统上.老机器称A机器,新机器称B机器. 前期调研 鉴于网上资料很多都是相同内容,而数据库的数据一般都很重要,这些方法都 ...

  7. php mysql数据备份命令_MySQL数据备份与恢复的相关操作命令

    将mysql安装目录设置到系统环境变量中, 方便在命令行终端直接执行.linux下mysql安装后, root默认密码为空, 可直接执行mysql 登录 将mysql安装目录设置到系统环境变量中, 方 ...

  8. mysql数据表案例_mysql中库和表的简单操作案例

    mysql中库和表的简单操作案例 发布时间:2020-12-05 09:54:06 来源:亿速云 阅读:71 作者:小新 这篇文章主要介绍mysql中库和表的简单操作案例,文中介绍的非常详细,具有一定 ...

  9. 初识mysql数据字段属性_MySQL数据库~~~~初识、基础数据类型

    一 数据库初识 1.1 什么是数据库 数据库(DataBase,简称DB),简而言之可视为电子化的文件柜----存储电子文件的处所,用户可以对文件中的数据运行新增,截取,更新,删除等操作. 所谓数据库 ...

最新文章

  1. python----python使用mysql
  2. [LeetCode] Plus One - 整数字符转换相加
  3. QQ卡机问题解决方法
  4. 【LeetCode笔记】4. 寻找两个正序数组的中位数(Java、二分、递归)
  5. supervisor简介
  6. MariaDB 10.3 解决掉了UPDATE不支持同一张表的子查询更新
  7. OA系统身份认证的设计
  8. 在Mac OS X中使用VIM开发STM32(3)
  9. 小程序毕设作品之微信酒店预订小程序毕业设计(6)开题答辩PPT
  10. 精简版XP安装IIS
  11. 使用opencv进行车牌提取及识别
  12. win10安装出现“Windows以保护你的电脑” Micosoft Defender SmartScreen阻止了无法识别的应用启动。运行此应用可能会导致你的电脑存在风险。
  13. ADB使用及日志分析
  14. health HEALTH_WARN;352 pgs degraded;352 pgs stuck unclean;352 pgs undersized;recovery 20/40 objects
  15. Servlet异常处理器
  16. hypermesh闪退启动解决(最全!!!)
  17. DevEco studio工具栏的打开与隐藏
  18. 基于vtkVoxelContoursToSurfaceFilter实现勾画图像的轮廓线面重建
  19. html的标题题记有哪些,关于温暖的题记唯美
  20. 打工还是创业?思路决定出路!

热门文章

  1. ifconfig源代码-NetBSD
  2. Android的HashMap方法,Android中实现HashMap排序的方法
  3. niginx之虚拟主机和域名解析
  4. **python基础类和对象(十二)
  5. 快速学会php视频,PHP视频从入门到精通---适合PHP初学者
  6. 【Cinemachine智能相机教程】VirtualCamera(四):Noise属性
  7. mysql aop_aop: 使用spring aop实现业务层mysql 读写分离
  8. 利达主机联网接线端子_拾遗●接线端子或连接器(1)
  9. OpenShift Security (3) - 准备客户端环境和演示应用
  10. OpenShift 4 之通过ImageTrigger自动构建变化级联镜像