数据库(DataBase)-外键简析&两种创建方法及删除

本文深入讲解MySQL中外键的概念、作用及创建方法,包括在创建表时添加约束和创建表后添加约束两种方式,同时介绍了外键的物理实现及最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 TABLEADD 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值