MySQL的数据管理
1.外键
概念:
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。
在实际操作中,将一个表的值放入第二个表来表示关联,所使用的值是第一个表的主键值(在必要时可包括复合主键值)。此时,第二个表中保存这些值的属性称为外键(foreign key)。
外键作用
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据,约束。使两张表形成关联,外键只能引用外表中的列的值或使用空值。
情景分析:
-
学生信息表的 gradeid 字段,要去引用年级表的 gradeid时
-
此时需要定义外键key,并给这个外键添加约束(执行引用)
创建外键:
1.0 – 在创建表的时候增加约束,(较复杂)
create database if not exists school;
use school;
create table if not exists `grade`(
`gradeid` int(10) not null Auto_increment comment '年级id',
`gradename` varchar(30) not null comment '年级名称',
primary key(`gradeid`)
)Engine = InnoDB default charset = utf8;
create table if not exists `student`(
`id` int(4) not null Auto_Increment comment '学号',
`name` varchar(30) not null default '匿名的小崽子' comment '姓名',
`pwd` varchar(30) not null default '123456' comment '密码',
`sex` varchar(2) not null default '女' comment '性别',
`birthday` datetime default null comment '出生日期',
`address` varchar(100) default null comment '家庭住址',
`email` varchar(50) default null comment '邮箱',
-- 新增的参数和约束.
`gradeid` int(10) not null comment '学生的年级',
primary key(`id`),
key `FK_gradeid` (`gradeid`),
constraint `FK_gradeid` foreign key (`gradeid`) references `grade` (`gradeid`)
-- 较复杂的方法.
)Engine = InnoDB default charset = utf8;
2.0 – 创建表成功后,添加约束。
create database if not exists school;
use school;
create table if not exists `grade`(
`gradeid` int(10) not null Auto_increment comment '年级id',
`gradename` varchar(30) not null comment '年级名称',
primary key(`gradeid`)
)Engine = InnoDB default charset = utf8;
create table if not exists `student`(
`id` int(4) not null Auto_Increment comment '学号',
`name` varchar(30) not null default '匿名的小崽子' comment '姓名',
`pwd` varchar(30) not null default '123456' comment '密码',
`sex` varchar(2) not null default '女' comment '性别',
`birthday` datetime default null comment '出生日期',
`address` varchar(100) default null comment '家庭住址',
`email` varchar(50) default null comment '邮箱',
`gradeid` int(10) not null comment '学生的年级',
primary key(`id`)
)Engine = InnoDB default charset = utf8;
-- 创建表的时候没有外键关系
ALTER TABLE `student`
ADD CONSTRAINT `FK_ gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade` (`gradeid`);
-- 格式:
ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 哪个表 (哪个字段);
删除有外键关系的表的时候,必须要先删除引用别人的表(从表) ,再删除被引用的表(主表)
-- 删除外键
ALTER TABLE student DROP FOREIGN KEY FK_gradeid;
-- 发现执行完上面的,索引还在,所以还要删除索引
-- 注:这个索引是建立外键的时候默认生成的
ALTER TABLE student DROP INDEX FK_gradeid;
以上的操作都是物理外键,数据库级别的外键,我们不建议使用! (避免数据库过多造成困扰, 这里了解即可)
最佳实践
- 数据库就是单纯的表,只用来存数据,只有行(代表数据)和列(代表字段)。
- 我们想使用多张表的数据,想使用外键(程序去实现)
作用简单总结:
1、为了一张表记录的数据不要太过冗余。
2、保持数据的一致性、完整性。
参考文献
《【狂神说Java】MySQL最新教程通俗易懂》
2020.05.14