You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL DELETE语句删除三表中指定event_id的记录?

解决根据唯一event_id删除多表中对应记录的问题

想要编写一条SQL语句,根据唯一的event_id删除数据库中Leagues、Tournaments、Trainings三个表其中一个表内的对应事件记录。每个event_id由随机函数生成,具有唯一性。尝试了多种SQL语法(包括使用逗号分隔多DELETE语句、UNION、分号分隔语句等),但都无法成功删除记录。以下是我的PHP代码:

if(isset($_POST['delete'])){
   
    $query = "delete from leagues where event_id= '$event_id', delete from tournaments where event_id= '$event_id', delete from trainings where event_id= '$event_id'"; 
    $result = mysqli_query($conn, $query);
    
    header('location: index_admin.php');
    
    
} else {
   
}

请问还有其他可行的解决方法吗?

可行的解决方法

1. 分别执行单表DELETE语句

由于event_id是唯一的,三个表中只会有一个表存在对应记录,依次执行三个单表删除语句即可,无匹配记录的语句会返回0行受影响,不影响最终结果。同时必须修复SQL语法错误,并杜绝SQL注入风险,推荐使用预处理语句:

if(isset($_POST['delete'])){
    // 预处理删除 leagues 表的语句
    $stmt = mysqli_prepare($conn, "DELETE FROM leagues WHERE event_id = ?");
    mysqli_stmt_bind_param($stmt, "s", $event_id);
    mysqli_stmt_execute($stmt);
    
    // 预处理删除 tournaments 表的语句
    $stmt = mysqli_prepare($conn, "DELETE FROM tournaments WHERE event_id = ?");
    mysqli_stmt_bind_param($stmt, "s", $event_id);
    mysqli_stmt_execute($stmt);
    
    // 预处理删除 trainings 表的语句
    $stmt = mysqli_prepare($conn, "DELETE FROM trainings WHERE event_id = ?");
    mysqli_stmt_bind_param($stmt, "s", $event_id);
    mysqli_stmt_execute($stmt);
    
    // 关闭预处理语句
    mysqli_stmt_close($stmt);
    
    header('location: index_admin.php');
} else {
    // 处理未触发删除的逻辑
}

2. 使用事务保证操作一致性(可选)

如果需要确保三个操作的原子性(虽然event_id唯一的场景下必要性较低,但可作为规范操作),可以开启事务:

if(isset($_POST['delete'])){
    // 开启事务
    mysqli_begin_transaction($conn);
    
    try {
        $stmt = mysqli_prepare($conn, "DELETE FROM leagues WHERE event_id = ?");
        mysqli_stmt_bind_param($stmt, "s", $event_id);
        mysqli_stmt_execute($stmt);
        
        $stmt = mysqli_prepare($conn, "DELETE FROM tournaments WHERE event_id = ?");
        mysqli_stmt_bind_param($stmt, "s", $event_id);
        mysqli_stmt_execute($stmt);
        
        $stmt = mysqli_prepare($conn, "DELETE FROM trainings WHERE event_id = ?");
        mysqli_stmt_bind_param($stmt, "s", $event_id);
        mysqli_stmt_execute($stmt);
        
        // 提交事务
        mysqli_commit($conn);
        mysqli_stmt_close($stmt);
    } catch (Exception $e) {
        // 操作失败则回滚事务
        mysqli_rollback($conn);
        // 可添加自定义错误处理逻辑
    }
    
    header('location: index_admin.php');
} else {
    // 处理未触发删除的逻辑
}

关键注意事项

  • 原代码语法错误:MySQL不支持用逗号分隔多个DELETE语句,即使使用分号分隔多语句,mysqli_query默认也不支持执行多语句,若要使用需调用mysqli_multi_query,但该方法存在较高SQL注入风险,不推荐。
  • 必须用预处理语句:直接将$event_id拼接进SQL语句会引发严重的SQL注入漏洞,预处理语句是最安全的解决方案。

内容的提问来源于stack exchange,提问作者A.Rasor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:45:14