MySQL从删库到跑路_高级(一)——数据完整性

作者:天山老妖S

链接:http://blog.51cto.com/9291927

一、数据完整性简介

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。
MyISAM类型的存储引擎不会在主键列上创建索引,表中记录的存储顺序与插入顺序相同。

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(sudentID,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 uc_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、默认值

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

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

给表中一列添加默认值约束:
alter table st modify column subject VARCHAR(20) default ‘计算机科学与技术‘;
删除表中一列的默认值约束:
alter 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、给指定列指定非空约束
alter 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,成功。
insert 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 TABLEscoreDROP FOREIGN KEYscore_fk;

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

ALTER TABLEscoreADD CONSTRAINTscore_fk2FOREIGN KEY (sid) REFERENCESstudent(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 TABLEscoreDROP FOREIGN KEYscore_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 TABLEscoreDROP FOREIGN KEYscore_fk;
增加成绩表的sid列外键约束,参照动作为set null
ALTER TABLEscoreADD CONSTRAINTscore_fkFOREIGN KEY (sid) REFERENCESstudent(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

喜欢的小伙伴们可以搜索我们个人的微信公众号“程序员的成长之路”点击关注或扫描下方二维码

原文地址:https://www.cnblogs.com/cxydczzl/p/9755340.html

时间: 2024-08-24 02:29:28

MySQL从删库到跑路_高级(一)——数据完整性的相关文章

MySQL从删库到跑路_高级(三)——视图

作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.视图简介 1.视图简介 视图是由SELECT查询语句所定义的一个虚拟表,是查看数据的一种非常有效的方式.视图包含一系列有名称的数据列和数据行,但视图中的数据并不真实在于数据库中,视图返回的是结果集. 2.创建视图的目的 视图是存储在数据中的查询的SQL语句,创建视图主要出于两种原因: A.实现安全.视图可设置用户对视图的访问权限. 创建查询是JAVA班学生成绩的视图javaview.NET班学生成绩的视图ne

DBA:多方式删库不跑路

语法;drop database 'DBname'; 说明:普通mysql用户需要root用户赋特定删除或者创建的权限 温馨提醒:删除数据库请多次确认是否要删除,删除数据库是不可逆的操作. 一.MySQL内置删库 [[email protected] ~]# mysql -uroot -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 2

理解Linux文档的默认安全机制、隐藏属性、特殊权限,妈妈在也不用担心你从删库到跑路!!!

写在前面 前面的章节 详解Linux文档属性.拥有者.群组.权限.差异,介绍了文档的基本权限,包括读写执行(r,w,x),还有若干的属性,包括是否为目录(d).文件(-).链接文件(l).拥有者.所属群组.容量大小(字节数).最后修改时间等等,可以通过chown.chgrp.chmod来变更这些属性和权限. 默认安全机制 首先,我们使用管理员root账户分别创建文件file001和目录dir001: 从上图可以看到, 文件file001的默认权限为rw-r--r--,即拥有者可读写,同群组下账户

mysql数据库从删库到跑路之mysql数据类型

一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data-types.html http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html mysql数据类型概览 1 数字(默认都是有符号,宽度指的是显示宽度,与存储无关) tinyint int bigint:个数,年龄,id,qq号,手

mysql数据库从删库到跑路之mysql多表查询

一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备表 company.employeecompany.department #建表 create table department( id int, name varchar(20) ); create table employee( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male

mysql数据库从删库到跑路之mysq索引

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重.说起加速查询,就不得不提到索引了. 什么是索引? 索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要.索引优化应该是对查询性能优化最有效的手段了.索引能够轻易

mysql数据库从删库到跑路之mysql:视图、触发器、事务、存储过程、函数

一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用

mysql数据库从删库到跑路之mysql表操作

表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id,name,qq,age称为字段,其余的,一行内容称为一条记录 内容: 1 创建表 2 查看表结构 3 数据类型 4 表完整性约束 5 修改表 6 复制表 7 删除表

Redis勒索事件爆发,如何避免从删库到跑路?

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 9月10日下午,又一起规模化利用Redis未授权访问漏洞×××数据库的事件发生,此次×××以勒索钱财作为第一目的,猖狂至极,×××者赤裸裸威胁,直接删除数据库数据.腾讯云安全系统在×××开始不到30s就启动全网拦截. ? 早在2017年,腾讯云就针对该高危漏洞发布过预警,但是仍有不少用户未进行安全加固.腾讯云安全专家提醒用户参考文末方法,尽快安全漏洞修复或部署防御.避免因被×××