【MySQL】基础之第四话-外键约束

1.1、创建表时设置外键约束

定义外键时,需要遵守下列规则:

1. 先有主表,再有子表。

2. 必须为主表定义主键。

3. 主键不能包含空值,但允许在外键中出现空值。

4. 外键中,列的数据类型必须和主表主键中对应列的数据类型相同。

-- 语法
CONSTRAINT <外键名>
FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]
-- 示例
CREATE TABLE Students
(
    StudentID   INT PRIMARY KEY AUTO_INCREMENT,
    StudentName VARCHAR(255) NOT NULL,
    gender      ENUM ('男','女','保密'),
    Age         INT,
    ClassID     INT,
    Constraint FK_Students_Classes FOREIGN KEY (ClassID) REFERENCES Classes (ID)
);

1.2、添加删除外键约束

-- (1)添加外键约束
ALTER TABLE <表名> ADD CONSTRAINT <外键名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);

-- 给学生表ClassID字段添加外键约束
ALTER TABLE Students ADD CONSTRAINT class_fk
FOREIGN KEY(ClassID) REFERENCES Classes(ID);
SHOW CREATE TABLE Students;


-- (2)删除外键约束
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
drop index 外键约束名 on <表名>; -- 同时将索引删除 

-- 将学生表ClassID字段的外键约束和索引删除
ALTER TABLE Students DROP FOREIGN KEY class_fk;
Drop Index class_fk on Students; -- 同时将索引删除

1.3、INNODB支持的ON语句

在 MySQL 中,InnoDB 是一种常用的存储引擎,它提供了一些 ON 语句来定义外键约束和触发器。

这些 ON 语句可以在创建或修改外键约束时使用,以定义在不同操作(更新或删除)发生时,从表中的数据应该如何处理。

这些 ON 语句只适用于 InnoDB 存储引擎。

以下是 InnoDB 支持的 ON 语句:

1. ON DELETE RESTRICT:如果关联的主表中的数据被删除,且从表中存在对应的数据,则禁止删除操作。
2. ON DELETE CASCADE:当关联的主表中的数据被删除时,自动删除从表中对应的数据。
3. ON DELETE SET NULL:当关联的主表中的数据被删除时,从表中对应的数据将被设置为 NULL。
4. ON DELETE SET DEFAULT:当关联的主表中的数据被删除时,从表中对应的数据将被设置为默认值。
5. ON UPDATE RESTRICT:如果关联的主表中的数据更新,且从表中存在对应的数据,则禁止更新操作。
6. ON UPDATE CASCADE:当关联的主表中的数据更新时,自动更新从表中的对应数据。
7. ON UPDATE SET NULL:当关联的主表中的数据更新时,从表中对应的数据将被设置为 NULL。
8. ON UPDATE SET DEFAULT:当关联的主表中的数据更新时,从表中对应的数据将被设置为默认值。

-- 简单示例
FOREIGN KEY (DeptID) REFERENCES Departments(DeptID)
    ON DELETE CASCADE
    ON UPDATE SET NULL;
  • 违反外键约束的常见错误
错误场景解决方案
插入从表时外键值不存在确保主表已存在对应记录。
删除主表记录时从表有依赖使用 ON DELETE CASCADE 或先清理从表数据。
外键字段与主键类型不匹配统一数据类型和长度。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值