Mysql必知必会-外键的使用

本文详细介绍了数据库中的外键约束,以学生表和课程表为例,阐述了外键的作用和定义规则。外键用于确保数据完整性,保证从表中的数据与主表相关联。当设置外键约束时,可以防止非法数据的插入、修改和删除操作。同时,外键还支持级联操作,如级联删除和级联更新,以保持数据的一致性。此外,文章还提供了创建和删除外键约束的SQL语句。

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

为了更好的理解外键,我们假设有一个学生表,表中字段(学号,姓名,班级,课程id),同时有个课程表(课程id,课程名);这个时候,学生表中的课程id就可以作为外键,从属于课程表中的课程id。
MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。

外键定义规则

  • 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
  • 必须为主表定义主键。主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
  • 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
  • 外键中列的数目必须和主表的主键中列的数目相同。
  • 外键中列的数据类型必须和主表主键中对应列的数据类型相同。

外键作用

保证数据的完整性,一致性主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。

外键表约束语句

设置外键约束

在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,语句如下:[CONSTRAINT 外键约束别名 ] FOREIGN KEY 子表外键字段 REFERENCES 父表 字段名;
说明

  • [ ] 中内容可以省略,但是最好设置,主要是在删除外键约束的时候比较方便,不然系统会设定默认需要人为去查询默认值。
  • 也可以在修改表时添加外键约束,语句如下
    ALTER TABLE <数据表名> ADD CONSTRAINT <外键名> FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);

删除外键约束

当一个表中不需要外键约束时,就需要从表中将其删除。外键一旦删除,就会解除主表和从表间的关联关系。

  • 删除外键约束的语法格式如下所示:
    ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;

外键约束的作用

阻止执行

  • 从表插入新行,其外键值不是主表的主键值便阻止插入;
  • 从表修改外键值,新值不是主表的主键值便阻止修改;
  • 主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
  • 主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。

级联删除

  • 主表删除行,连带从表的相关行一起删除;
  • 主表修改主键值,连带从表相关行的外键值一起修改。两种方法提供给用户选择。无论选取哪种方法,从表里都不会有多余行。从另一个角度理解,用拒绝同一事物在从表中的标志与主表不一致来实现与主表中的标志一致。
    两种实现方法,通过下面方式选择:
  • 界面:设级联更新、级联删除两个选择方框,选取则级联执行、不选取则阻止执行;
  • 命令:设E)kSCM)E、RESTRICT两个可选项,CASCADE为级联执行、RESTRICT为阻止执行。
### MySQL 基础教程 必知必会 操作指南 #### 数据库创建与管理 在开始任何数据操作之前,了解如何管理和创建数据库至关重要。通过SQL语句可以轻松完成这一过程: ```sql CREATE DATABASE example_db; USE example_db; DROP DATABASE IF EXISTS old_database_name; ``` 上述命令分别用于创建新数据库、切换当前使用数据库以及删除指定的旧数据库。 #### 表结构设计原则 对于表的设计而言,遵循一定的命名习惯有助于提高可读性和维护效率。尽管关字和函数名称在SQL中不区分大小写,但为了便于识别,推荐将它们设为大写形式;而数据库名、表名及字段名则应保持一致的小写字母格式[^2]。 #### 创建表格实例 下面展示了一个具体的例子来说明怎样构建一张包含基本约束条件的新表——这里以书籍信息为例: ```sql -- 创建图书表 create table `library`.`books`( `id` int primary key auto_increment, `title` varchar(100) not null, `isbn` char(13) not null unique, -- ISBN作为唯一标识符 `author_id` int not null, foreign key (`author_id`) references authors(`id`) ); ``` 此段代码不仅展示了如何设置主(primary key),还介绍了(foreign key)的应用方式,且指定了ISBN号需满足唯一性(unique constraint)[^3]的要求。 #### 查询优化技巧 当涉及到复杂查询时,合理运用聚合函数配合GROUP BY子句能够有效简化逻辑提升性能。需要注意的是,在某些情况下省略必要的分组依据可能会引发特定类型的语法错误(例如ORA-00937),所以务必确保每一条涉及汇总计算的结果都对应着恰当的数据分类标准[^4]。 #### 更新与删除记录 除了增删改查之,掌握批量更新或多条目移除的方法也是十分重要的技能之一: ```sql UPDATE employees SET salary = salary * 1.1 WHERE department = 'Sales'; DELETE FROM orders WHERE order_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR); ``` 这两行指令分别实现了针对销售部门员工薪资上调的操作,以及清除一年前订单的历史记录功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值