千家信息网

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

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,这篇文章将为大家详细讲解有关mysql中怎么实现一个完整性约束,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。约束条件作用:用于保证数据的完整性和一致性
千家信息网最后更新 2025年01月21日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安全错误 数据库的锁怎样保障安全 闵行区项目数据库销售价格 cems网络安全 信息安全芯片认证服务器 hp服务器机柜 软件开发公司需要什么证 互联网加安全科技领域 西奥电梯服务器如何设置中文 戴尔服务器怎么重启管理卡 数据库管理技术发展的阶段是 w10网络安全模式进不去 新乡嘟嘟网络技术下的app 网络安全法有关的手抄报 淘宝怎么发布软件开发服务 安徽丰巢网络技术有限公司 数据库管理员的职位简称 上海星域互联网科技有限公司 伊春市博迪互联网科技有限公司 网络技术应用组建企业网络 层次型数据库管理系统简称 杭州泛销互联网科技 华为软件开发技术面 开发数据库系统用什么 如何看数据库文件是否被调用 个税软件备份数据库失败 服务器怎么更换至强最新处理器 籽岷服务器小游戏战墙 数据库窗体文本框内容设置 数据库数据存放位置 计算机网络技术网关英文 网络安全手抄报彩铅版
0