千家信息网

mysql中怎么实现一个完整性约束

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章将为大家详细讲解有关mysql中怎么实现一个完整性约束,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。约束条件作用:用于保证数据的完整性和一致性
千家信息网最后更新 2026年11月02日mysql中怎么实现一个完整性约束

这篇文章将为大家详细讲解有关mysql中怎么实现一个完整性约束,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

约束条件作用:用于保证数据的完整性和一致性

主要分为

PRIMARY KEY (PK) #标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK) #标识该字段为该表的外键
NOT NULL #标识该字段不能为空
UNIQUE KEY (UK) #标识该字段的值是唯一的,
AUTO_INCREMENT #标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT #为该字段设置默认值
UNSIGNED #无符号
ZEROFILL #使用0填充

unique

在mysql中称为单列唯一

#例子1:create table department(  id int,  name char(10) unique);mysql> insert into department values(1,'it'),(2,'it');ERROR 1062 (23000): Duplicate entry 'it' for key 'name'#例子2:create table department(  id int unique,  name char(10) unique);insert into department values(1,'it'),(2,'sale');#第二种创建unique的方式create table department(  id int,  name char(10) ,  unique(id),  unique(name));insert into department values(1,'it'),(2,'sale');

联合唯一:只要两列记录,有一列不同,既符合联合唯一的约束

# 创建services表mysql> create table services(  -> id int,  -> ip char(15),  -> port int,  -> unique(id),  -> unique(ip,port)  -> );Query OK, 0 rows affected (0.05 sec)mysql> desc services;+-------+----------+------+-----+---------+-------+| Field | Type   | Null | Key | Default | Extra |+-------+----------+------+-----+---------+-------+| id    | int(11)  | YES  | UNI | NULL    |       || ip    | char(15) | YES  | MUL | NULL    |       || port  | int(11) | YES  |     | NULL    |       |+-------+----------+------+-----+---------+-------+3 rows in set (0.01 sec)#联合唯一,只要两列记录,有一列不同,既符合联合唯一的约束mysql> insert into services values  -> (1,'192,168,11,23',80),  -> (2,'192,168,11,23',81),  -> (3,'192,168,11,25',80);Query OK, 3 rows affected (0.01 sec)Records: 3 Duplicates: 0 Warnings: 0mysql> select * from services;+------+---------------+------+| id  | ip      | port |+------+---------------+------+|  1 | 192,168,11,23 |  80 ||  2 | 192,168,11,23 |  81 ||  3 | 192,168,11,25 |  80 |+------+---------------+------+3 rows in set (0.00 sec)mysql> insert into services values (4,'192,168,11,23',80);ERROR 1062 (23000): Duplicate entry '192,168,11,23-80' for key 'ip'

auto_increment

约束:约束的字段为自动增长,约束的字段必须同时被key约束

不指定id,则自动增长

# 创建studentcreate table student(id int primary key auto_increment,name varchar(20),sex enum('male','female') default 'male');mysql> desc student;+-------+-----------------------+------+-----+---------+----------------+| Field | Type         | Null | Key | Default | Extra     |+-------+-----------------------+------+-----+---------+----------------+| id  | int(11)        | NO  | PRI | NULL  | auto_increment || name | varchar(20)      | YES |   | NULL  |        || sex  | enum('male','female') | YES |   | male  |        |+-------+-----------------------+------+-----+---------+----------------+rows in set (0.17 sec)#插入记录mysql> insert into student(name) values ('老白'),('小白');Query OK, 2 rows affected (0.01 sec)Records: 2 Duplicates: 0 Warnings: 0mysql> select * from student;+----+--------+------+| id | name  | sex |+----+--------+------+| 1 | 老白  | male || 2 | 小白  | male |+----+--------+------+rows in set (0.00 sec)

指定id的情况

mysql> insert into student values(4,'asb','female');Query OK, 1 row affected (0.00 sec)mysql> insert into student values(7,'wsb','female');Query OK, 1 row affected (0.01 sec)mysql> select * from student;+----+--------+--------+| id | name  | sex  |+----+--------+--------+| 1 | 老白  | male  || 2 | 小白  | male  || 4 | asb  | female || 7 | wsb  | female |+----+--------+--------+rows in set (0.00 sec)# 再次插入一条不指定id的记录,会在之前的最后一条记录继续增长mysql> insert into student(name) values ('大白');Query OK, 1 row affected (0.00 sec)mysql> select * from student;+----+--------+--------+| id | name  | sex  |+----+--------+--------+| 1 | 老白  | male  || 2 | 小白  | male  || 4 | asb  | female || 7 | wsb  | female || 8 | 大白  | male  |+----+--------+--------+rows in set (0.00 sec)

对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长

mysql> delete from student;Query OK, 5 rows affected (0.00 sec)mysql> select * from student;Empty set (0.00 sec)mysql> select * from student;Empty set (0.00 sec)mysql> insert into student(name) values('ysb');Query OK, 1 row affected (0.01 sec)mysql> select * from student;+----+------+------+| id | name | sex |+----+------+------+| 9 | ysb | male |+----+------+------+row in set (0.00 sec)#应该用truncate清空表,比起delete一条一条地删除记录,truncate是直接清空表,在删除大表时用它mysql> truncate student;Query OK, 0 rows affected (0.03 sec)mysql> insert into student(name) values('xiaobai');Query OK, 1 row affected (0.00 sec)mysql> select * from student;+----+---------+------+| id | name  | sex |+----+---------+------+| 1 | xiaobai | male |+----+---------+------+row in set (0.00 sec)mysql>auto_increment_increment和 auto_increment_offset

查看可用的 开头auto_inc的词

mysql> show variables like 'auto_inc%';+--------------------------+-------+| Variable_name      | Value |+--------------------------+-------+| auto_increment_increment | 1   || auto_increment_offset  | 1   |+--------------------------+-------+rows in set (0.02 sec)
# 步长auto_increment_increment,默认为1# 起始的偏移量auto_increment_offset, 默认是1# 设置步长 为会话设置,只在本次连接中有效set session auto_increment_increment=5;#全局设置步长 都有效。set global auto_increment_increment=5;# 设置起始偏移量set global auto_increment_offset=3;

强调:If the value of auto_increment_offset is greater than that of auto_increment_increment, the value of auto_increment_offset is ignored.
翻译:如果auto_increment_offset的值大于auto_increment_increment的值,则auto_increment_offset的值会被忽略

设置完起始偏移量和步长之后,再次执行show variables like'auto_inc%';

发现跟之前一样,必须先exit,再登录才有效。

mysql> show variables like'auto_inc%';+--------------------------+-------+| Variable_name      | Value |+--------------------------+-------+| auto_increment_increment | 5   || auto_increment_offset  | 3   |+--------------------------+-------+rows in set (0.00 sec)#因为之前有一条记录id=1mysql> select * from student;+----+---------+------+| id | name  | sex |+----+---------+------+| 1 | xiaobai | male |+----+---------+------+row in set (0.00 sec)# 下次插入的时候,从起始位置3开始,每次插入记录id+5mysql> insert into student(name) values('ma1'),('ma2'),('ma3');Query OK, 3 rows affected (0.00 sec)Records: 3 Duplicates: 0 Warnings: 0mysql> select * from student;+----+---------+------+| id | name  | sex |+----+---------+------+| 1 | xiaobai | male || 3 | ma1   | male || 8 | ma2   | male || 13 | ma3   | male |+----+---------+------+

清空表区分delete和truncate的区别:

delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。

truncate table t1;数据量大,删除速度比上一条快,且直接从零开始。

foreign key

理解foreign key

如上图如果一个公司有很多员工,每个员工都对应一个部门,在填表的时候就会重复写这些部门,太冗余了

我们可以将它们分离

此时有两张表,一张是employee表,简称emp表(关联表,也就从表)。一张是department表,简称dep表(被关联表,也叫主表)。

#1.创建表时先创建被关联表,再创建关联表# 先创建被关联表(dep表)create table dep(  id int primary key,  name varchar(20) not null,  descripe varchar(20) not null);#再创建关联表(emp表)create table emp(  id int primary key,  name varchar(20) not null,  age int not null,  dep_id int,  constraint fk_dep foreign key(dep_id) references dep(id) //创建约束);#2.插入记录时,先往被关联表中插入记录,再往关联表中插入记录insert into dep values(1,'IT','IT技术有限部门'),(2,'销售部','销售部门'),(3,'财务部','花钱太多部门');insert into emp values(1,'zhangsan',18,1),(2,'lisi',19,1),(3,'egon',20,2),(4,'yuanhao',40,3),(5,'alex',18,2);

3.删除表

#按道理来说,删除了部门表中的某个部门,员工表的有关联的记录相继删除。mysql> delete from dep where id=3;ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`db5`.`emp`, CONSTRAINT `fk_name` FOREIGN KEY (`dep_id`) REFERENCES `dep` (`id`))#但是先删除员工表的记录之后,再删除当前部门就没有任何问题mysql> delete from emp where dep_id =3;Query OK, 1 row affected (0.00 sec)mysql> select * from emp;+----+----------+-----+--------+| id | name   | age | dep_id |+----+----------+-----+--------+| 1 | zhangsan | 18 |   1 || 2 | lisi   | 18 |   1 || 3 | egon   | 20 |   2 || 5 | alex   | 18 |   2 |+----+----------+-----+--------+4 rows in set (0.00 sec)mysql> delete from dep where id=3;Query OK, 1 row affected (0.00 sec)mysql> select * from dep;+----+-----------+----------------------+| id | name   | descripe       |+----+-----------+----------------------+| 1 | IT    | IT技术有限部门    || 2 | 销售部  | 销售部门       |+----+-----------+----------------------+2 rows in set (0.00 sec)

上面的删除表记录的操作比较繁琐,按道理讲,裁掉一个部门,该部门的员工也会被裁掉。其实呢,在建表的时候还有个很重要的内容,叫同步删除,同步更新

on delete cascade #同步删除
on update cascade #同步更新

create table emp(  id int primary key,  name varchar(20) not null,  age int not null,  dep_id int,  constraint fk_dep foreign key(dep_id) references dep(id)   on delete cascade #同步删除  on update cascade #同步更新);
#再去删被关联表(dep)的记录,关联表(emp)中的记录也跟着删除mysql> delete from dep where id=3;Query OK, 1 row affected (0.00 sec)mysql> select * from dep;+----+-----------+----------------------+| id | name   | descripe       |+----+-----------+----------------------+| 1 | IT    | IT技术有限部门    || 2 | 销售部  | 销售部门       |+----+-----------+----------------------+2 rows in set (0.00 sec)mysql> select * from emp;+----+----------+-----+--------+| id | name   | age | dep_id |+----+----------+-----+--------+| 1 | zhangsan | 18 |   1 || 2 | lisi   | 19 |   1 || 3 | egon   | 20 |   2 || 5 | alex   | 18 |   2 |+----+----------+-----+--------+4 rows in set (0.00 sec)#再去更改被关联表(dep)的记录,关联表(emp)中的记录也跟着更改mysql> update dep set id=222 where id=2;Query OK, 1 row affected (0.02 sec)Rows matched: 1 Changed: 1 Warnings: 0# 赶紧去查看一下两张表是否都被删除了,是否都被更改了mysql> select * from dep;+-----+-----------+----------------------+| id | name   | descripe       |+-----+-----------+----------------------+|  1 | IT    | IT技术有限部门    || 222 | 销售部  | 销售部门       |+-----+-----------+----------------------+2 rows in set (0.00 sec)mysql> select * from emp;+----+----------+-----+--------+| id | name   | age | dep_id |+----+----------+-----+--------+| 1 | zhangsan | 18 |   1 || 2 | lisi   | 19 |   1 || 3 | egon   | 20 |  222 || 5 | alex   | 18 |  222 |+----+----------+-----+--------+4 rows in set (0.00 sec)

关于mysql中怎么实现一个完整性约束就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

部门 关联 字段 销售 标识 同步 员工 增长 起始 技术 有限 小白 销售部 步长 联合 完整性 有效 内容 数据 时候 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手冲咖啡和咖啡机区别 互联网巨头科技公司 易通互联网络科技有限公司 亿账通互联网科技 沃里互联网科技 互联网科技公司有哪些 深圳期待互联网科技 安控科技rtu产品工业互联网 深圳市运趣互联网科技有限公司 哈尔滨新华互联网科技学院 互联网时代科技改变生活 互联网经济与金融科技 河南猎农互联网科技有限公司 崇明区互联网教育科技诚信经营 互联网行业科技股 科技互联网的核心竞争力 南通创西澳互联网科技有限公司 深圳互联网科技的发展 富国互联网金融科技混合基金 互联网高科技绘画 互联网科技网 科技股互联网 互联网科技的发展 广州互联网络科技有限公司 彤创互联网科技有限公司 朱啸虎曾投资哪些互联网科技企业 滨湖区互联网智能科技产品有哪些 互联网领先科技活动 广州三三互联网科技有限公司 北京瑞云互联网科技有限公司
0