一、数据完整性简介

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;

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

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

alter table product ENGINE=InnoDB;
alter table TStudent add primary key(studentid);
alter table TStudent drop primary key;
AUTO_INCREMENT PRIMARY KEY

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

create table product ( productID int PRIMARY KEY AUTO_INCREMENT not NULL, pName VARCHAR(10), price DOUBLE )ENGINE=MyISAM default CHARSET=utf8;
alter table TStudent modify column studentID int PRIMARY KEY AUTO_INCREMENT;
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;
alter table student add PRIMARY KEY(studentID,id);
alter table student drop PRIMARY KEY;

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

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

create table score (sname VARCHAR(10) UNIQUE, score int not NULL );
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;
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;

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

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

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

create table score (sname VARCHAR(10) not NULL, score int not NULL );
alert table score modify column score int not NULL;
alter table score modify column score int;

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

age int check(age between 10 and 20);

四、参照完整性

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,'孙悟空')
instert into score values (1,98)
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

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

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

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

删除score表的外键约束

alter table score drop foreign key score_fk;
ALTER TABLE `score` ADD CONSTRAINT `score_fk` FOREIGN KEY (`sid`) REFERENCES `student` (`sid`) ON DELETE NO ACTION ON UPDATE NO ACTION;
update student set sid = 11 where sid = 10
delete from student where sid = 10
delete from student where sid=10delete from score where sid=10;

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

删除成绩表的外键约束

alter table score drop foreign key score_fk;
alter table score add constraint score_fk foreign key (sid) references student (sid) on delete set null on update set 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)

delete from student where sid = 1

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

select * from score

总结

更多相关文章

  1. 校验和:探究密码学中的数据完整性问题
  2. 从删库到跑路,DBA 如何防止被淘汰?
  3. 员工删库跑路,企业赔付1.5亿引商家不满,SaaS服务侵权第一案!
  4. 视频播放如何更安全流畅?看南非影音娱乐DStv Now App集成系统完整
  5. 《Golang从入门到跑路》之map的初识
  6. 《Golang从入门到跑路》之指针
  7. 「什么值得买」网站挂了,疑程序员删库跑路
  8. 全球顶尖大厂程序员恶意报复公司“删库跑路”!损失超1600万元
  9. APP安全之APK完整性校验

随机推荐

  1. Android(安卓)4.0.1 源码下载,模拟器编译
  2. Android 支持的度量单位
  3. How to study Android OpenGL ES
  4. Android(安卓)中的XMPP 应用
  5. Android使用FFmpeg(七)--ffmpeg实现暂停
  6. Android使用FFmpeg动态库播放视频
  7. Android基础之Android系统架构
  8. Android调用相机程序和图片处理程序获得
  9. [ZT]Android线程模型(Painless Threading
  10. android之计时器 chronometer