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
# 级联
# 会报
# 删了
# 的是
# 行数
# 看着
# 如果你
# 那就
# 不需要
# 不支持
相关文章:
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
广德云建站网站建设方案与建站流程优化指南
如何选择香港主机高效搭建外贸独立站?
C#如何序列化对象为XML XmlSerializer用法
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
如何在云主机上快速搭建多站点网站?
PHP 500报错的快速解决方法
高防服务器租用指南:配置选择与快速部署攻略
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
实现虚拟支付需哪些建站技术支撑?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
建站之星2.7模板:企业网站建设与h5定制设计专题
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
如何在橙子建站上传落地页?操作指南详解
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
历史网站制作软件,华为如何找回被删除的网站?
如何挑选优质建站一级代理提升网站排名?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
如何用PHP快速搭建高效网站?分步指南
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
如何实现建站之星域名转发设置?
建站10G流量真的够用吗?如何应对访问高峰?
如何通过wdcp面板快速创建网站?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
微信小程序 五星评分(包括半颗星评分)实例代码
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
北京网站制作公司哪家好一点,北京租房网站有哪些?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
建站主机选购指南:核心配置与性价比推荐解析
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
清除minerd进程的简单方法
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
郑州企业网站制作公司,郑州招聘网站有哪些?
安云自助建站系统如何快速提升SEO排名?
建站主机数据库如何配置才能提升网站性能?
如何高效搭建专业期货交易平台网站?
建站主机系统SEO优化与智能配置核心关键词操作指南
建站之星代理如何优化在线客服效率?
海南网站制作公司有哪些,海口网是哪家的?
C++如何编写函数模板?(泛型编程入门)
孙琪峥织梦建站教程如何优化数据库安全?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
建站之星如何通过成品分离优化网站效率?
广州商城建站系统开发成本与周期如何控制?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
寿县云建站:智能SEO优化与多行业模板快速上线指南
*请认真填写需求信息,我们会在24小时内与您取得联系。