数据库4

30 阅读8分钟

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 主表(主键)主表删除的动作

一般情况下主表删除时从表置空, 主表更新时从表级联