全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

php删除数据怎么关联删_级联删除外键约束设置【操作】

MySQL外键必须显式指定ON DELETE CASCADE才能触发级联删除,PHP不处理该逻辑;若未设置,需重建外键或手动分步删除并加事务保障一致性。

MySQL 外键定义时必须显式指定 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_RULERESTRICTNO 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;

PHP 中用 mysqliPDO 执行普通 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_profilesaddresses
  • 没加事务,删了一半出错,留下脏数据
  • TRUNCATE 替代 DELETE —— TRUNCATE 不触发外键级联,也不走 WHERE,还不能回滚

ON DELETE SET NULLON 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 字段允许 NULLALTER TABLE orders MODIFY user_id INT NULL)。

ON DELETE RESTRICT 是默认行为,删主记录前会检查子表是否存在关联行,有就直接报错:Cannot delete or update a parent row: a foreign key constraint fails。这时候你得自己查、自己提示、自己决定怎么处理。

级联删除看着省事,但一旦误删,恢复成本高。生产环境上线前务必确认外键行为,别只靠 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小时内与您取得联系。