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。
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从删库到跑路_高级(七)——事务和锁
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.事务简介 1.事务简介 事务(Transaction)是指作为单个逻辑工作单元执行的一系列操作. 2.事物的特效 ...
- MySQL从删库到跑路_高级(六)——索引
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.索引简介 1.索引简介 索引(Index)是帮助MySQL高效获取数据的数据结构. 在MySQL中,索引属于存储 ...
- MySQL从删库到跑路_高级(五)——触发器
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.触发器简介 1.触发器简介 触发器是和表关联的特殊的存储过程,可以再插入,删除或修改表中的数据时触发执行,比数据 ...
- MySQL从删库到跑路_高级(四)——存储过程
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.存储过程简介 1.存储过程简介 存储过程是一组具有特定功能的SQl语句集组成的可编程的函数,经编译创建并保存在数 ...
- MySQL从删库到跑路_高级(二)——自定义函数
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.自定义函数简介 自定义函数(user-defined function UDF)是一种对MySQL扩展的途径,其 ...
- MySQL从删库到跑路_高级(三)——视图
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.视图简介 1.视图简介 视图是由SELECT查询语句所定义的一个虚拟表,是查看数据的一种非常有效的方式.视图包含 ...
- MySQL从删库到跑路(三)——SQL语言
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.SQL语言简介 1.SQL语言简介 SQL是结构化查询语言(Structured Query Language) ...
- MySQL从删库到跑路(五)——SQL查询
作者:天山老妖S 链接:http://blog.51cto.com/9291927 1.查询所有字段 在SELECT语句中使用星号“”通配符查询所有字段在SELECT语句中指定所有字段select f ...
- MySQL从删库到跑路(一)——MySQL数据库简介
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.MySQL简介 1.MySQL简介 MySQL是一个轻量级关系型数据库管理系统,由瑞典MySQL AB公司开发, ...
随机推荐
- android 设置系统屏幕亮度
/** * 获得当前屏幕亮度的模式 * SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度 * SCREEN_BRIGHTNESS_MODE_MANUAL=0 为 ...
- iOS - 利用 iTunes 接口检查 App 版本更新
iOS 想要检查 App 当前版本是否为最新,一般的方案大概都是服务器自己提供一个接口来获取 App 最新版本是多少,然后再做出相应提示是否需要更新,但是接口需要手动维护,应用要审核,还得等审核通过以 ...
- you do not have permission to pull from the repository解决方法
使用git进行项目的版本管理,换了台电脑,配置了账号和邮箱后,pull一个私有项目的时候,发现一个问题: 原因分析: 这是由于没有设置Gitee的SSH公钥.在未设置SSH公钥的情况下,可以使用git ...
- Spring注解及作用
一: spring mvc中的@PathVariable是用来获得请求url中的动态参数的 @PathVariable用于方法中的参数,表示方法参数绑定到地址URL的模板: 例 @Controller ...
- Keepalived+Nginx高可用集群
Keepalived简介 Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替 ...
- POJ-放苹果(DP)
放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 29074 Accepted: 18376 Description 把M个 ...
- 【问题收录】Ubuntu14.04连接两个双显示器失败的解决方案
https://blog.csdn.net/chichoxian/article/details/60642533
- POJ 2987 - Firing - [最大权闭合子图]
题目链接:http://poj.org/problem?id=2987 Time Limit: 5000MS Memory Limit: 131072K Description You’ve fina ...
- 畅通工程 HDU - 1863 最小生成树模板
两个模板: kruskal #include<stdio.h> #include<queue> #include<algorithm> #include<io ...
- hdu-4283 You Are the One 区间dp,
题意:n个人排队上台,每个人有一屌丝值D,他的不满意值=D*(k-1)(k为他前面的总人数). 求整个队列不满意值之和的最小值.你只有一个操作,就是把队首的人塞进小黑屋,也就是压入栈中,后面的人就被提 ...