侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

深入浅析MySQL从删库到跑路_高级(一)――数据完整性

数据库  /  管理员 发布于 6年前   325

一、数据完整性简介

1、数据完整性简介

数据冗余是指数据库中存在一些重复的数据,数据完整性是指数据库中的数据能够正确反应实际情况。

数据完整性是指数据的可靠性和准确性,数据完整性类型有四种:

A、实体完整性:实体的完整性强制表的标识符列或主键的完整性(通过唯一约束,主键约束或标识列属性)。

B、域完整性:限制类型(数据类型),格式(通过检查约束和规则),可能值范围(通过外键约束,检查约束,默认值定义,非空约束和规则)。

C、引用完整性:在删除和输入记录时,引用完整性保持表之间已定义的关系。引用完整性确保键值在所有表中一致,不能引用不存在的值。如果一个键。

D、定义完整性:用户自己定义的业务规则,比如使用触发器实现自定义业务规则。

2、数据完整性实现方式

MySQL不支持Check约束,虽然可以在列上添加check约束,但不起作用。

二、实体完整性实现

1、实体完整性的实现简介

实体完整性的实现有两种方式:

A、主键约束:一张表只能有一列设置主键,值必须唯一,不允许为空,innoDB存储引擎,主键就是索引。

B、唯一值约束:一张表可以有多个列添加唯一值约束,一直允许一条记录为空值。

实体完整性,由主键和唯一性约束来实现,确保表中记录有一列唯一标识。主键又分为Primary key和AUTO_INCREMENT PRIMARY KEY两种。

2、主键

MySQL的主键名总是PRIMARY,当创建主键约束时,如果表的存储引擎是innoDB,系统默认会在所在的列和列组合上建立对应的唯一索引,

主键约束相当于唯一约束与非空约束的组合,主键约束列不允许重复,也不允许出现空值;多列组合的主键约束,列都不允许为空值,并且组合的值不允许重复。每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。

A、创建表时指定主键

创建表时指定主键的方式一:

create table product ( productID int PRIMARY KEY, pName VARCHAR(10), price DOUBLE )ENGINE=MyISAM default CHARSET=utf8;

创建表时指定主键的方式二:

create table product ( productID int, pName VARCHAR(10), price DOUBLE, CONSTRAINT pk_s_productID PRIMARY KEY(productID) )ENGINE=MyISAM default CHARSET=utf8;

在指定主键的表中插入记录时,不允许插入重复ID,如果不指定主键的值,默认为0。

MylSAM类型的存储引擎不会在主键列上创建索引,表中记录的存储顺序与插入顺序相同。

InnoDB存储引擎会自动在主键列上创建索引,插入的记录会根据主键的值的顺序排放。

alter table product ENGINE=InnoDB;

B、增加主键

alter table TStudent add primary key(studentid);

C、删除主键

alter table TStudent drop primary key;

3、自增主键

AUTO_INCREMENT PRIMARY KEY

如果不指定主键值,会自动在现有的主键值的最大值上自动增加1作为新记录的主键,主键值默认从1开始。可以在数据数据类型整数型的列上添加自增主键。

 

A、创建表时指定自增自增列

create table product ( productID int PRIMARY KEY AUTO_INCREMENT not NULL, pName VARCHAR(10), price DOUBLE )ENGINE=MyISAM default CHARSET=utf8;

B、为现有的表指定自增列

alter table TStudent modify column studentID int PRIMARY KEY AUTO_INCREMENT;

C、删除表中自增列

alter table TStudent modify column studentID int not NULL;

删除自增列,仍然时主键,但是没有自增长功能

4、复合主键

使用表的两列或多列创建主键。

A、创建表时指定复合主键

create table student ( studentID int, id INT, sname VARCHAR(10), score int, PRIMARY KEY(studentid,id) )ENGINE=MyISAM default CHARSET=utf8;

B、给表增加复合主键

alter table student add PRIMARY KEY(studentID,id);

C、删除复合主键

alter table student drop PRIMARY KEY;

5、唯一约束

UNIQUE KEY,唯一约束,指定某列和几列组合的数据不能重复。

A、创建表时指定唯一性约束

create table score (sname VARCHAR(10) UNIQUE, score int not NULL );

B、给现有列增加唯一性约束

alter table score add CONSTRAINT us_sname UNIQUE(sname);

如果表中现有记录有重复值,不允许添加唯一性约束。可以通过聚合函数,查找有重复的记录,删除,再创建唯一性约束。

C、创建复合唯一性索引

create table student ( studentID int, id INT, sname VARCHAR(10), score int, CONSTRAINT uc_id UNIQUE(studentID, id) )ENGINE=MyISAM default CHARSET=utf8;

D、删除列的唯一性约束

alter table score drop index uc_sname;

三、域完整性

1、默认值

在表中插入一条新1的记录时,如果没有为该字段赋值,那么数据库系统会自动为该字段赋一条默认值。

create table st(sid INT not null primary key auto_increment,sname varchar(10),subject varchar(20) default '软件工程',entertime TIMESTAMP default now());

给表中一列添加默认值约束:

alert table st modify column subject VARCHAR(20) default '计算机科学与技术';

删除表中一列的默认值约束:

alert table st modify column subject VARCHAR(20) default NULL;

2、创建非空约束

非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。

Null类型特征:所有的类型的值都可以是null,包括int、float等数据类型 空字符串是不等于NULL,0也不等于NULL。

A、创建表时给列指定非空约束

create table score (sname VARCHAR(10) not NULL, score int not NULL );

B、给指定列指定非空约束

alert table score modify column score int not NULL;

C、删除非空约束

alter table score modify column score int;

3、检查check

check关键字,在插入新行或者更改已有行时才起作用,作用是阻止不满足条件的值进入该列,对null值无效,因为插入null就相当于没有插入。一个列可有多个check。

age int check(age between 10 and 20);

目前MySQL不支持check约束,微软MSSQL支持Check约束,但创建表时可以指定Check约束,但不起作用。

四、参照完整性

1、参照完整性简介

MySQL参照完整性一般是通过MySQL外键(foreign key)实现的。

外键(仅innoDB支持)所引用表的列必须是主键。

外键声明包括三个部分:

A、哪个列或列组合是外键

B、指定外键参照的表和列

C、参照动作[cascade(级联操作),restrict(拒绝操作),set null(设为空),no action,set default]。

如果外键约束指定了参照动作,主表记录做修改,删除,从表引用的列会做相应修改,或不修改,拒绝修改或设置为默认值。

引用表的列名必须是主键,且在删除引用表时必须删除引用关系或者删除当前表。

2、创建表时指定外键

创建两张表,学生表student和成绩表score,成绩表的sid列的取值参照学生表(学生表student的sid列设置为主键,且表的存储引擎为innodb,成绩表score的存储引擎也必须设置为innodb)。

create table student(sid int not null primary key,sname varchar(20)) engine=innodb;create table score(sid int not null,mark INT,constraint score_fk FOREIGN KEY (sid)references student(sid) on delete cascade on update cascade) engine=innodb;

在学生表插入一条记录

insert into student values (1,'孙悟空')

在成绩表插入一条记录,学号是1,成功。

instert into score values (1,98)

在成绩表插入一条记录,学号是2,失败。

insert into score values (2,88)

在学生表插入学号是2的一条记录

insert into student values (2,'唐僧')

再在成绩表插入一条学号是2的记录,成功,证明外键参照成功。

insert into score values (2,88);

3、删除参照约束

alter table score drop foreign key score_fk;

4、给现有表增加参照约束

alter table score add constraint score_fk2 foreing key (sid) references student (sid);

5、验证级联动作删除和更新

在score表创建的参照完整性,删除动作和更新动作的参照动作选择了cascade(级联操作),当学生表的sid更新时,分数表score的相应的sid也会更新,当学生被删除,分数表对应的sid的记录也会自动删除。

更新学生表学号是1的学生的学号为10

update student set sid = 10 where sid = 1

查看成绩表,可以看到以前学号是1的已经变成了10

select * from score

删除学生表学号是2的学生

delete from student where sid = 2

可以看到成绩表,该学生的成绩已经级联删除

select * from score

6、验证级联动作No Aaction

级联动作设置为NO ACTION,如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作。

Restrict动作同no action,都是立即检查外键约束。

将参照动作设置为no action,如果成绩表score有该学生sid,将不能更改学生表student表的学生sid列,也不能删除该学生。除非你先删除该学生的成绩,再删除该学生。

删除score表的外键约束

alter table score drop foreign key score_fk;

增加score表的sid列外键约束

ALTER TABLE `score` ADD CONSTRAINT `score_fk` FOREIGN KEY (`sid`) REFERENCES `student` (`sid`) ON DELETE NO ACTION ON UPDATE NO ACTION;

更新学号是10的学生的学号,失败

update student set sid = 11 where sid = 10

删除学号是10的学生,失败

delete from student where sid = 10

需要先删除学生成绩表中的记录,再删除该学生。

delete from student where sid=10delete from score where sid=10;

7、验证级联动作Set NULL

在父表上update/delete记录时,将子表上匹配记录的列设为null,要注意子表的外键不能为not null。

删除成绩表的外键约束

alter table score drop foreign key score_fk;

增加成绩表的sid列外键约束,参照动作为set null

alter table score add constraint score_fk foreign key (sid) references student (sid) on delete set null on update set null;

修改成绩表的sid列默认值为NULL

ALTER TABLE `score` MODIFY COLUMN `sid` INTEGER(11) DEFAULT NULL;insert into student values (1,'孙悟空')insert into student values (2,'猪八戒')insert into score values (1,98)insert into score values (2,88)

删除学生表中学号1的学生

delete from student where sid = 1

查看成绩表,成绩表中的学号为1的列为NULL

select * from score

总结

以上所述是小编给大家介绍的深入浅析MySQL从删库到跑路_高级(一)――数据完整性,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!


  • 上一条:
    MySQL中大对象的多版本并发控制详解
    下一条:
    关于mysql 8.0.13zip包安装方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客