MySQL外键必须显式指定ON DELETE CASCADE才能触发级联删除,PHP不处理该逻辑;若未设置,需重建外键或手动分步删除并加事务保障一致性。
ON DELETE CASCADE
PHP 本身不处理级联删除逻辑,真正起作用的是 MySQL 的外键约束行为。如果你执行 DELETE FROM users WHERE id = 123 后,关联的 orders 表数据没被删,大概率是建表时没加 ON DELETE CASCADE。
检查现有外键是否支持级联删除:
SELECT CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, UPDATE_RULE, DELETE_RULE FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE k JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS r ON k.CONSTRAINT_NAME = r.CONSTRAINT_NAME WHERE k.TABLE_SCHEMA = 'your_db_name' AND k.TABLE_NAME = 'orders' AND k.COLUMN_NAME = 'user_id';
如果 DELETE_RULE 是 RESTRICT 或 NO ACTION,那就不会自动删子记录。
要补上级联删除,需先删旧外键再重建(注意备份):
ALTER TABLE orders DROP FOREIGN KEY fk_orders_user_id; ALTER TABLE orders ADD CONSTRAINT fk_orders_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
mysqli 或 PDO 执行普通 DELETE 即可触发级联只要外键约束已正确设置,PHP 层不需要额外写逻辑。直接删主表,MySQL 自动清理子表。
例如用 PDO 删除用户:
$pdo->prepare("DELETE FROM users WHERE id = ?")->execute([123]);
或用 mysqli:
$stmt = $mysqli->prepare("DELETE FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
$id = 123;
$stmt->execute();
⚠️ 注意:事务中执行更安全,避免部分删除成功、部分失败导致数据不一致:
$pdo->beginTransaction()
$pdo->exec("DELETE ...") 返回受影响总行数(含级联删除的子记录)commit(),失败则 rollback()
有些老项目禁用外键,或表引擎是 MyISAM(不支持外键),这时只能在 PHP 里分步操作。
顺序必须是:先删子表 → 再删主表,否则会报外键约束错误:
$pdo->beginTransaction();
try {
$pdo->exec("DELETE FROM orders WHERE user_id = 123");
$pdo->exec("DELETE FROM users WHERE id = 123");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollback();
throw $e;
}
常见坑:
user_profiles、addresses)TRUNCATE 替代 DELETE —— TRUNCATE 不触发外键级联,也不走 WHERE,还不能回滚ON DELETE SET NULL 和 ON DELETE RESTRICT 的实际区别
不是所有场景都适合 CASCADE。比如用户删了,但订单历史要保留,只是把 user_id 设为空:
ALTER TABLE orders
DROP FOREIGN KEY fk_orders_user_id,
ADD CONSTRAINT fk_orders_user_id
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
此时要求 user_id 字段允许 NULL(ALTER TABLE orders MODIFY user_id INT NULL)。
ON DELETE RESTRICT 是默认行为,删主记录前会检查子表是否存在关联行,有就直接报错:Cannot delete or update a parent row: a foreign key constraint fail。这时候你得自己查、自己提示、自己决定怎么处理。
s
级联删除看着省事,但一旦误删,恢复成本高。生产环境上线前务必确认外键行为,别只靠 PHP 代码“以为”它会自动删。
# mysql
# php
# cad
# ai
# 区别
# NULL
# mysqli
# pdo
# int
# restrict
# delete
# table
# 级联
# 会报
# 删了
# 的是
# 行数
# 看着
# 如果你
# 那就
# 不需要
# 不支持
相关文章:
头像制作网站在线制作软件,dw网页背景图像怎么设置?
已有域名如何免费搭建网站?
教学论文网站制作软件有哪些,写论文用什么软件
?
建站之星安装失败:服务器环境不兼容?
如何在云主机上快速搭建多站点网站?
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
javascript基本数据类型及类型检测常用方法小结
如何在自有机房高效搭建专业网站?
建站之星如何保障用户数据免受黑客入侵?
建站之星导航配置指南:自助建站与SEO优化全解析
宝塔Windows建站如何避免显示默认IIS页面?
,想在网上投简历,哪几个网站比较好?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
如何在服务器上三步完成建站并提升流量?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
教程网站设计制作软件,怎么创建自己的一个网站?
如何安全更换建站之星模板并保留数据?
如何选择香港主机高效搭建外贸独立站?
定制建站流程步骤详解:一站式方案设计与开发指南
网站网页制作专业公司,怎样制作自己的网页?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
h5网站制作工具有哪些,h5页面制作工具有哪些?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
网站制作报价单模板图片,小松挖机官方网站报价?
济南网站制作的价格,历城一职专官方网站?
Swift中循环语句中的转移语句 break 和 continue
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
建站主机是否属于云主机类型?
中山网站制作网页,中山新生登记系统登记流程?
如何用PHP快速搭建CMS系统?
如何解决ASP生成WAP建站中文乱码问题?
网站图片在线制作软件,怎么在图片上做链接?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
如何快速搭建高效WAP手机网站?
宝塔建站助手安装配置与建站模板使用全流程解析
Android自定义listview布局实现上拉加载下拉刷新功能
打鱼网站制作软件,波克捕鱼官方号怎么注册?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
建站之星免费模板:自助建站系统与智能响应式一键生成
如何撰写建站申请书?关键要点有哪些?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
网站制作免费,什么网站能看正片电影?
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
学校为何禁止电信移动建设网站?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
制作旅游网站html,怎样注册旅游网站?
北京的网站制作公司有哪些,哪个视频网站最好?
*请认真填写需求信息,我们会在24小时内与您取得联系。