建设一个教程视频网站需要什么资质摄影设计说明500字
建设一个教程视频网站需要什么资质,摄影设计说明500字,Mui框架做网站,外链怎么做外键基础概念
外键是一个表中的字段#xff0c;它引用另一个表的主键或唯一键#xff0c;用于确保两个表之间的数据一致性。
-- 主表#xff1a;用户
CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL
); -- 从表#xff1a;订单…外键基础概念外键是一个表中的字段它引用另一个表的主键或唯一键用于确保两个表之间的数据一致性。-- 主表用户CREATETABLEuser(idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(50)NOTNULL);-- 从表订单通过 user_id 关联 user.idCREATETABLEorders(idINTPRIMARYKEYAUTO_INCREMENT,order_noVARCHAR(20)NOTNULL,user_idINT,FOREIGNKEY(user_id)REFERENCESuser(id)-- 外键约束);本质是数据库层面的强制引用完整性检查。外键约束类型与行为当主表数据变更时从表如何响应MySQL 提供 5 种约束行为约束类型主表 DELETE主表 UPDATE使用场景CASCADE级联删除从表数据级联更新从表外键值强关联数据用户注销→删除订单SET NULL从表外键设为 NULL从表外键设为 NULL可选关联部门删除→员工部门ID置空RESTRICT阻止删除默认行为阻止更新强保护有订单时不能删用户NO ACTION同 RESTRICTSQL 标准同 RESTRICT与 RESTRICT 等价SET DEFAULT设为默认值InnoDB 不支持设为默认值InnoDB 引擎无效完整创建语法CREATETABLEorders(idINTPRIMARYKEY,user_idINT,FOREIGNKEY(user_id)REFERENCESuser(id)ONDELETECASCADE-- 删除用户时级联删除订单ONUPDATERESTRICT-- 更新用户ID时阻止一般不会更新主键);外键实现原理数据字典与元数据-- 查看外键信息SELECTCONSTRAINT_NAME,TABLE_NAME,COLUMN_NAME,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAMEFROMINFORMATION_SCHEMA.KEY_COLUMN_USAGEWHEREREFERENCED_TABLE_NAMEISNOTNULL;InnoDB 在数据字典中维护外键元数据包括父表、子表、关联列和约束类型。锁机制性能杀手当插入/更新/删除子表时InnoDB 会加间隙锁Gap Lock保护父表-- 场景orders 表有外键 user_id 引用 user.idBEGIN;INSERTINTOorders(user_id)VALUES(100);-- 子表插入-- InnoDB 隐式加锁-- 在 user 表的 id100 记录上加 **共享间隙锁**-- 阻止其他事务删除/更新 user.id100防止插入孤儿订单锁范围主表user (id 列)插入子表给主表对应 id 加共享锁删除主表检查从表是否有引用加共享锁扫描更新主表 id给新/旧 id 都加锁性能影响高并发写入时外键检查导致锁竞争加剧删除主表记录需全表扫描从表无索引时外键检查时机约束检查模式-- 会话级设置 SET foreign_key_checks 0; -- 临时关闭外键检查危险 SET foreign_key_checks 1; -- 开启默认批量导入数据时-- 先关闭外键检查加速导入SETforeign_key_checks0;LOADDATAINFILEorders.csvINTOTABLEorders;SETforeign_key_checks1;-- 完成后务必开启外键的优点数据一致性保障-- 无法插入孤儿记录INSERTINTOorders(user_id)VALUES(999);-- ERROR 1452: Cannot add or update a child row-- 无法删除被引用的父记录DELETEFROMuserWHEREid100;-- ERROR 1451: Cannot delete or update a parent row级联操作简化业务代码-- 删除用户时自动级联删除订单、地址、积分ONDELETECASCADE;-- 无需手动写多个 DELETE 语句文档化表关系外键约束显性定义了表间关系新开发人员可快速理解数据模型。外键的缺点互联网大厂弃用原因性能瓶颈锁竞争高并发下外键检查间隙锁导致锁等待延迟增加外键检查增加 5-10% SQL 执行时间级联删除慢删除主表 1 条记录可能触发从表百万级级联删除扩展性差分库分表失效跨库外键无法检查ShardingSphere 等中间件不支持外键微服务架构冲突服务拆分后跨服务外键无法约束业务耦合删除主表受阻业务想软删除用户但外键阻止热更新困难修改表结构需先删外键增加运维复杂度级联陷阱-- 误操作删除 1 个用户级联删除 10 万订单无法回滚DELETEFROMuserWHEREid1;-- 瞬间删 10 万数据-- 解决应用层软删除 定时任务清理UPDATEuserSETdeleted1WHEREid1;-- 业务层控制大厂最佳实践去外键化应用层保证一致性ServicepublicclassUserService{TransactionalpublicvoiddeleteUser(LonguserId){// 1. 先检查是否有订单if(orderRepository.countByUserId(userId)0){thrownewBusinessException(用户有订单不能删除);}// 2. 再删除用户userRepository.deleteById(userId);}}软删除 定期归档-- 用户表增加 deleted 字段ALTERTABLEuserADDCOLUMNdeletedTINYINTDEFAULT0;-- 删除操作变为更新UPDATEuserSETdeleted1WHEREid100;-- 从表订单保留 user_id业务查询自动过滤SELECT*FROMordersWHEREuser_idIN(SELECTidFROMuserWHEREdeleted0);分布式事务跨服务// 使用 Seata / Saga 模式保证最终一致性GlobalTransactionalpublicvoidcreateOrder(LonguserId){// 1. 调用用户服务校验用户存在userService.checkUserExists(userId);// 2. 创建订单orderRepository.save(newOrder(userId));// 3. 异常时全局回滚}什么时候该用外键推荐使用场景内部管理系统并发低、数据一致性要求高-- 企业内部 ERPCREATETABLEemployee_dept(emp_idINT,dept_idINT,FOREIGNKEY(emp_id)REFERENCESemployee(id)ONDELETECASCADE);强关联数据无孤立记录可能-- 订单明细与订单头FOREIGNKEY(order_id)REFERENCESorder_header(id)ONDELETECASCADE开发规范严格团队小、运维规范不推荐场景高并发互联网业务C2C 电商、社交分库分表架构ShardingSphere、MyCat 环境微服务架构跨服务数据无法约束需要柔性事务允许短暂不一致性能对比测试-- 测试环境MySQL 8.0, 100 万订单, 10 万用户-- 场景 1插入订单有外键INSERTINTOorders(user_id,amount)VALUES(1001,99.00);-- 耗时1.2ms检查 user.id1001 是否存在-- 场景 2插入订单无外键INSERTINTOorders(user_id,amount)VALUES(1001,99.00);-- 耗时0.3ms-- 场景 3删除用户有外键 级联DELETEFROMuserWHEREid1001;-- 耗时500ms级联删除 10 条订单-- 场景 4删除用户无外键 软删UPDATEuserSETdeleted1WHEREid1001;-- 耗时0.1ms性能结论外键使写入性能降低 30-50%删除性能降低 10-100 倍。外键与索引的关系外键自动创建索引-- 建外键时若 user_id 无索引InnoDB 自动创建FOREIGNKEY(user_id)REFERENCESuser(id);-- InnoDB 自动CREATE INDEX user_id ON orders(user_id);手动删除外键索引-- ❌ 错误无法删除被外键使用的索引DROPINDEXuser_idONorders;-- ERROR-- ✅ 正确先删外键再删索引ALTERTABLEordersDROPFOREIGNKEYorders_ibfk_1;DROPINDEXuser_idONorders;