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

一、数据完整性简介

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从删库到跑路_高级(一)——数据完整性,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 基于MySQL数据库的数据约束实例及五种完整性约束介绍

    为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确.有效.相容. #数据约束 #五种完整性约束: #NOT NULL :非空约束,指定某列不能为空: #UNIQUE : 唯一约束,指定某列或者几列组合不能重复 #PRIMARY KEY :主键,指定该列的值可以唯一地标识该列记录 #FOREIGN KEY :外键,指定该行记录从属于主表中的一条记录,主要用于参照完

  • MySQL学习笔记4:完整性约束限制字段

    完整性约束是对字段进行限制,从而符合该字段达到我们期望的效果比如字段含有默认值,不能是NULL等 直观点说:如果插入的数据不满足限制要求,数据库管理系统就拒绝执行操作 设置表的主键 主键能够标识表中每条信息的唯一性,如同身份证号码和人的关系 人可以同名,但是身份证号码却是唯一的, 创建主键的目的在于快速查找到表中的某一条信息 单字段主键 复制代码 代码如下: mysql> create table student( -> id int primary key, -> name varch

  • 必须会的SQL语句(八) 数据库的完整性约束

    实体完整性 1.建表时定义主键 Create table 表名    (         Sno int identity(1,1),         Sname nvarchar(20),         --设置主键         Primary key (Sno)    )   2.添加主键 alter table 表名     add constraint PK_表名_Sno     primary key(id) 参照完整性1.建表时定义外键 create table 表名   (

  • 详解SQL Server数据库架构和对象、定义数据完整性

    前言 本节我们继续SQL之旅,本节我们如题来讲讲一些基本知识以及需要注意的地方,若有不妥之处,还望指出,简短的内容,深入的理解. 数据库架构和对象 数据库包含架构,而架构又包含对象,架构可以看做是表.视图.存储过程等对象的容器.架构是一个命名空间,它被用做对象名称的前缀,比如在Cnblogs的架构中有一个名称为Blogs的表,此时我们用架构式限定式名称(即两部分式对象名称)所以Blogs表示为Cnblogs.Blogs.如果我们引用对象时省略了架构名称,SQL Server将会检查对象是否存在用

  • 详解sql中的参照完整性(一对一,一对多,多对多)

    一.参照完整性 参照完整性指的就是多表之间的设计,主要使用外键约束. 多表设计: 一对多.多对多.一对一设计 1.一对多 关联主要语句: constraint cus_ord_fk foreign key (customer_id) REFERENCES customer(id) 创建客户表--订单表 一个客户可以订多份订单,每份订单只能有一个客户. -- 关联(1对N) create table customer( id int PRIMARY KEY auto_increment, name

  • 详解MySQL:数据完整性

    数据完整性分为:实体完整性,域完整性,参考完整性. 参考完整性: 参照完整性指的就是多表之间的设计,主要使用外键约束. 多表设计: 一对多.多对多.一对一设计 一:实体(行)完整性 实体完整性通过表的主键来实现. 使用主键来表示一条记录的唯一,且不为空 语法:primary key 主键分类: 逻辑主键:例如ID,不代表实际的业务意义,只是用来唯一标识一条记录(推荐) 业务主键:例如username,参与实际的业务逻辑. 特点:唯一,not null 自动增长:auto_increment 例如

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

    一.数据完整性简介 1.数据完整性简介 数据冗余是指数据库中存在一些重复的数据,数据完整性是指数据库中的数据能够正确反应实际情况. 数据完整性是指数据的可靠性和准确性,数据完整性类型有四种: A.实体完整性:实体的完整性强制表的标识符列或主键的完整性(通过唯一约束,主键约束或标识列属性). B.域完整性:限制类型(数据类型),格式(通过检查约束和规则),可能值范围(通过外键约束,检查约束,默认值定义,非空约束和规则). C.引用完整性:在删除和输入记录时,引用完整性保持表之间已定义的关系.引用完

  • 防止删库跑路及高级代码投毒技巧

    目录 引言 删库跑路 可操作性 1. 权限控制 2. 数据备份 易发现性 影响后果 代码投毒 最近的案例 可操作性 预防策略 最后 引言 事情是这样的,最近在做开源软件供应链安全相关的项目,之前没了解这方面知识的时候感觉服务器被黑,数据库被删,网站被攻,这些东西都离我们太遥远了,因为感觉好像都轮不到我们,直到我开始做这个项目,才发现网络安全,软件安全问题真的是无处不在. 今天我们来聊聊删库跑路和代码投毒. 我们从可操作性及易发现性还有后果及预防策略上来探讨一下. 删库跑路 在软件行业,“删库跑路

  • mysql如何能有效防止删库跑路

    目录 安全模式设置 测试 1.无where的update和delete 2.非索引键的delete 3.索引键的delete 总结 大家肯定听说过,有些开发者由于个人失误,在delete或者update语句的时候没有添加where语句,导致整个表数据错乱. mysql安全模式:mysql发现delete.update语句没有添加where或者limit条件时会报错.整个sql将无法执行,有效防止了误删表的情况. 安全模式设置 在mysql中通过如下命令查看状态: show variables l

  • 删库跑路?使用xtraback备份MySQL数据库的方法

    一.mysqldump备份方式是采用逻辑备份.最大的缺陷就是备份和恢复的速度都慢,对于一个50G的数据库而言,这个速度还是可以接受的,但是如果数据库非常大,那在使用mysqdump备份就不是太合适了.. 这时候就需要一种很好用又高效的工具,xtraback 就是其中的一款,号称免费版的innodb hotbackup xtraback特点如下: 备份过程快速,可靠 备份过程不会打断正在执行的事务 能够基于压缩等功能节约磁盘空间和流量 自动实现备份检验 还原速度快 二.安装xtraback 1)下

  • mysql常用sql与命令之从入门到删库跑路

    启动与停止 启动mysql服务 sudo /usr/local/mysql/support-files/mysql.server start 停止mysql服务 sudo /usr/local/mysql/support-files/mysql.server stop 重启mysql服务 sudo /usr/local/mysql/support-files/mysql.server restart 进入mysql目录文件 cd /usr/local/mysql/support-files 进入

  • 你也许连删库跑路都不会(delete、drop和truncate删除数据)

    前言 这两年 IT 界隔三岔五的出现一次程序员删库的新闻,这种删库跑路的行为往往会给受害公司造成很大的损失,甚至会导致一个公司的破产.我们程序员看到这类新闻的时候很大一部分会把它当作一个闲聊的摊子,但是各位读者你是否想过这么一个问题:我知道怎么正确删库吗?看到这里估计有读者会感觉删库谁不会啊 Delete 以下呗.如果你这么想的话那就接着看这篇文章吧,在后面的内容中我将讲解数据库删除数据的方式以及原理. 在 MySQL 中有三种删除数据的方式,分别是 delete.drop 和 truncate

  • 关于Spring的@Transaction导致数据库回滚全部生效问题(又删库跑路)

    1 前言 很多需要使用事务的场景,都只是在方法上直接添加个@Transactional注解 但是,你以为这真的够了吗? 事务如果未达到完美效果,在开发和测试阶段都难以被发现,因为你难以考虑到太多意外场景.但当业务数据量发展,就可能导致大量数据不一致的问题,就会造成前人栽树后人踩坑,需要大量人力排查解决问题和修复数据. 2 如何确认Spring事务生效了? 使用@Transactional一键开启声明式事务, 这就真的事务生效了?过于信任框架总有"意外惊喜".来看如下案例 领域层 实体

  • 浅析MySQL 备份与恢复

    1.简介 数据无价,MySQL作为一个数据库系统,其备份自然也是非常重要且有必要去做.备份的理由千千万,预防故障,安全需求,回滚,审计,删了又改的需求等等,备份的重要性不言而喻.除了备份本身, 如何使用备份来恢复 服务也是一项重点内容,不能用来恢复的备份没有意义.本文主要会针对备份和恢复这两方面做一些简单的介绍. 本文为<高性能MySQL>备份相关章节的读书笔记. 2.备份和恢复的简单定义 正如简介所说,备份人尽皆知,也很容易引起人的重视.根据需求写定期脚本,或者使用其他方式都是比较常见的.但

  • 浅析MySQL的WriteSet并行复制

    [历史背景] 岁月更迭中我已经从事MySQL-DBA这个工作三个年头,见证MySQL从"基本可用","边缘系统可以用MySQL","哦操!你怎么不用MySQL"; 正所谓!"一个数据库的境遇既取决于历史的进程,取决于它的自我奋斗!",关于"历史的进程"在此不表,关于"自我奋斗"这里也只想谈一下并行复制的几个关键时间结点 总的来说MySQL关于并行复制到目前为止经历过三个比较关键的时间结点

  • 浅析mysql 定时备份任务

    简介 在生产环境上,为了避免数据的丢失,通常情况下都会定时的对数据库进行备份.而Linux的crontab指令则可以帮助我们实现对数据库定时进行备份.首先我们来简单了解crontab指令,如果你会了请跳到下一个内容mysql备份. 本文章的mysql数据库是安装在docker容器当中,以此为例进行讲解.没有安装到docker容器当中也可以参照参照. contab定时任务 使用crontab -e来编写我们的定时任务. 0 5 * * 1 [command] 前面的5个数字分别代表分.时.日.月.

随机推荐