mysql外键策略
1.外键
- 建表时添加外键:constraint 外键名 foreign key 从表字段 references 主表字段 级联操作
create table dage( create table xiaodi( dage_id int primary key, xiaodi_id int, name char(10) name char(10), ); dage_id int, constraint fk foreign key(dage_id) references dage(dage_id));
- 建表后添加外键:alter table 表名 add constraint 外键名 foreign key(字段1) references 表名2(字段名) 级联操作
- 查看:①desc 表名; ②show create table 表名
- 删除:alter table 表名 drop foreign key 外键名
注意:设置了外键的表是从表,它关联的表被称为主表;给从表插入数据时,插入数据必须是主表的被关联字段出现的数据;先建主表再建从表;先删从表再删主表。
2.级联操作
- on delete cascade:主表中的数据被删,从表中相关数据也会被删
- on update cascade:主表中的数据被改后,从表中的相关数据也会被修改
- on delete cascade on update cascade:删除和修改有级联操作
- on delete set null:主表总数据被删除后,从表中相关数据为null
- on update set null
3.示例
一个用户可有拥有多个订单,一个订单只能属于一个用户,一对多,在tb_order中使用外键user_id关联tb_user的id。
当删除、更新tb_user中的主键时,与之关联的tb_order要受到影响,比如
#tb_user中的一条记录 1 chy abcd #tb_order中一条记录,10是tb_order的id,1是所属user的id 10 ...... 1
删除tb_user中id=1这条记录,或者更新id字段的值,mysql会如何处理tb_order中与之关联的记录?
设计外键时,mysql提供了4种外键关联策略
1、RESTRICT 限制(默认策略)
要删除tb_user中的记录,或者更新主键字段的值,如果tb_order中有记录与之关联,则不能删除、更新(执行操作时会报错)
2、CASCADE 级联
删除tb_user中的记录时,会自动删除tb_order中与之关联的记录;
修改tb_user中id字段的值时,会自动修改tb_order中与之关联的记录的外键字段的值(同步变化)。
3、NO ACTION 什么也不做
删除tb_user中的记录,或者修改id字段的值,但tb_order中有记录与之关联,可以删除、更新,tb_order中与之关联的记录不作任何处理(数据不发生变化)。
此种策略需要存储引擎支持,如果存储引擎不支持,会自动换为RESTRICT。
4、SET NULL 置为NULL
删除tb_user的记录,或更新主键字段的值,会自动将tb_order中与之关联的记录的外键字段的值置为NULL。
这种方式有一个要求:设计tb_order时,外键user_id不能使用NOT NULL约束。
CASCADE用得最多,其次是RESTRICT,未设置外键关联策略时默认为RESTRICT(为了数据安全)。
http://www.cppblog.com/wolf/articles/69089.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库