1.什么事数据的完整性?
保证保存的数据库中的数据都是正确的
2如何保证数据完整性
数据的完整性可以分为三类:实体完整性,域完整性,参照完整性
无论是哪一种完整性都是在创建表的时候添加约束即可
3实体完整性
-
什么是实体?
表中的一行数据就是一个实体
-
如何保证实体的完整性?
保证实体的完整性就是保证每一行数据的唯一性
-
实体完整性约束类型
主键约束(primary key)
唯一约束(unique)
自动增长列(auto_increment)
-
主键约束(primary key)
主键用于唯一标识,表中的每一条数据,和现实中的身份证很像
create table person( id int primary key, name varchar(20) ) insert into person2 values (1, 'lnj'); insert into person2 values (2, 'lnj');
主键的特征:
如果将 某一个字段设置成了主键那么这个字段就不能重复
如果将某个字段设置成了主键,那么这个字段的取值就不能为null
一张表中只有一个主键,不能有多个主键
create table person (
id int primary key,
name varchar(20)
)
除了可以在字段数据类型后面添加primary key ,将这个字段变成主键以外,还可以通过在最后写上primary key(字段名称)的方式来指定主键
create table person(
id int ,
name varchar(20),
primary key (id)
)
insert into person3 values (1, 'lnj');
insert into person3 values (1, 'lnj');
-
什么是联合主键
通过将表中的某个永远不重复的字段设置为主键,从而达到保证每一行数据的唯一性(实体完整性)
但是在企业开发中有时候我们可以找不到不重复的字段,此时我们还可以铜鼓联合主键的方式来保证每一行数据的唯一性,联合主键就是同时将多个字段作为一个主键来使用
create table person(
name varchar(20),
age int,
primary key(name, age)
);
注意点:联合主键并不是添加多个主键,而是将多个字段的值作为主键来使用,也就是我们过去指定的id作为主键,那么id的取值不能重复,而现在我们指定的name和age作为主键,那么name+age的值就不能重复
唯一约束(unique)
唯一约束用于保证某个字段永远不重复
create table person (
id int uniaue,
name varchar (20)
)
insert into person values (1, 'lnj');
insert into person values (1, 'lnj');
主键和唯一键的区别
唯一约束和主键约束一样,被约束的字段的取值不能够重复,主键在一张表中只能有一个,而唯一约束在一张表中可以有多个,- 主键的取值不能为Null, 而唯一约束的取值可以是Null
create table person2(
id int unique,
name varchar(20) unique
);
insert into person2 values (1, 'lnj');
insert into person2 values (2, 'lnj');
-
自动增长约束
自动增长约束的作用是让某个字段的取值从1开始递增,从而保证实体完整性
crate table person(
id int auto_increment,
name varchar(20)
)
注意点:如果某个字段是自动增长的那么这个字段必须是主键才可以
create table person(
id int auto_increment primary key,
name varchr(20)
)
insert into person values (1, 'lnj');
如果仅仅是主键,那么取值不能是null,但是如果主键是自动增长的,那么取值就可以是null或者default
在企业开发中我们应该如何选择主键:
- 最少性:能用一个字段作为主键,就不要使用多个字段
- 稳定性:能用不被操作的(修改)字段作为主键,就不要使用会被操作的字段作为主键
- 一般情况我们会定义一个名称叫做id的字段,并且这个字段是整型的,并且这个字段是自增长的来作为主键
如果修改主键约束
alter table 表名 add primary key(字段)
create table person (
id int
name varchar(20)
)
alter table person add primary key(id)
insert into person values (1 ,'yi')
如何修改自动增长约
alter table 表名 modify 字段名称 数据类型 auto_increment;
create table person(
id int ,
name varchar(20)
)
alter table person modify id int auto_increment
insert into person values (null, 'yk')
域完整性
什么是域?
一行数据中的每一个单元格都是一个域
如何保证域的完整性?
保证域的完整性就是保证每一个单元格数据的正确性
使用正确的数据格式类型
例如:人的年龄不可能炒股255岁,而且不能是负数,所以我们就可以使用TINYINT UNSINGNED
使用非空约束(not null)
使用默认值约束(default)
实例:
create table person(
id int,
name varchar(20) not null
)
insert into person values (1,null);
create table person(
id int ,
name varchar(20) default 'it666'
)
insert into person values (1,null)
insert into person values (1,default)
insert into person values (1,'zd')
注意点:哪怕设置了默认值,传入null之后也不会使用默认值
参照物完整性
参照完整性又称引用完整性,主要用于保证多表之间引用关系的正确性
如何保证参照完整性?
默认情况下表与表之间都是独立存在的,不会互相影响,也正因为如此,默认情况下也不会检查表与表之间的依赖关系,所以为了保证表与表之间参照完整性,我们可以通过外键来保证参照物的完整性
create table stu(
id int auto_increment primary key,
name varchar(20),
gender enum('男','女','妖')
);
create table grade(
id int auto_increment primary key,
km varchar(20),
score double,
uid int
);
insert into stu values (null, 'zs', '男');
insert into stu values (null, 'ls', '女');
insert into grade values (null, '语文', 100, 1);
insert into grade values (null, '数学', 99, 1);
insert into grade values (null, '英语', 98, 1);
insert into grade values (null, '语文', 100, 3);
insert into grade values (null, '数学', 99, 3);
insert into grade values (null, '英语', 98, 3);
什么是外键?
如果一张表中有一个字段指向了,别一张表中的主键,那就将该字段叫做外键
例如: 成绩表中的uid引用了学生表中的id, 那么成绩表中的uid我们就称之为外键
|--------------------| |-----------------------|
| id | name | gender | | id | km | score | uid |
| 1 | 张三 | 男 | | 1 |语文| 100 | 1 |
| 2 | 李四 | 女 | | 2 |数学| 99 | 1 |
|--------------------| | 3 |英语| 98 | 1 |
| 4 |语文| 60 | 2 |
| 5 |数学| 59 | 2 |
| 6 |英语| 58 | 2 |
|-----------------------|
create table grade2(
id int auto_increment primary key,
km varchar(20),
score double,
uid int,
foreign key(uid) references stu(id)
);
insert into grade2 values (null, '语文', 100, 1);
insert into grade2 values (null, '数学', 99, 1);
insert into grade2 values (null, '英语', 98, 1);
insert into grade2 values (null, '语文', 100, 3);
insert into grade2 values (null, '数学', 99, 3);
insert into grade2 values (null, '英语', 98, 3);
外键注意点:
只有InnoDB的储存方式才支持外键
外键的数据类型必须和指向的主键一样
在一对多的关系中,外键一般定义在多的一方(一个学生有多门成绩,那么外键就定义在成绩表中)
定义外键的表我们称之为从表,被外键引用的表我们称之为主表
创建表时定义外键
foregin key (外键字段名称) reference 主表名称(主表主键名称)
如何动态添加外键
alter table 从表名称 add foreign key(外键字段名称) references 主表名称(主表主键名称);
create table grade(
id int auto_increment primary key,
km carchar(20),
score double,
uid int
)
insert into grade values (null, '语文', 100, 3);
alter table grade add foreign key(uid) references stu(id);
insert into grade values (null, '语文', 100, 3);
如何查看外键是谁
show create table 从表名
show create table grade
CREATE TABLE `grade` (
`id` int NOT NULL AUTO_INCREMENT,
`km` varchar(20) DEFAULT NULL,
`score` double DEFAULT NULL,
`uid` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
CONSTRAINT `grade_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `stu` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
注意点:
CONSTRAINT CONSTRAINT `grade_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `stu` (`id`)含义
将uid变成外键, 外键的名称是grade_ibfk_1
uid的取值引用的是stu这张表中的id字段的值
如何动态的删除外键
alter table 从表名 drop foreign key 外键名称
alter table grade d rop foreign key grade_ibfk_1
insert into grade values (null,'语文',100,3)
外键的操作:(前面都是严格操作)
主表不存在对应数据,从表是不允许添加
insert into grade values (null,'语文',100,3)
从表引用着数据,从表不允许添加
delete from stu where id=1
从表引用这个数据,主表不允许修改
update stu set id=3 where id=1
置空操作(null)
在企业开发中,我们可能必须要删除主表的数据,但是如果主表被删除了,从表就不完整了,所以企业开发中,我们可以通过置空操作,在主表数据删除的同时从表关联的数据、
create table grade2(
id int auto_increment primary key,
km varchar(20),
score double,
uid int,
foreign key(uid) references stu(id) on delete set null
);
insert into grade values (null, '语文', 100, 1);
delete from stu where id=1;
级联操作
在企业开发中,我们可能必须要修改主表的数据,但是如果主表被修改了,从表就不完整了,所以企业开发中可以通过级联操作,在修改主表的数据同时修改从表关联的数据
create table grade3(
id int auto_increment primary key,
km varchar(20),
score double,
uid int,
foreign key(uid) references stu(id) on update cascade
);
insert into grade values (null, '语文', 100, 1);
update stu set id=1 where id=3;
[constraint 外键名称] foreign key(外键字段) references 主表(主键)主表删除的动作
一般情况下主表删除时从表置空, 主表更新时从表级联