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

使用数组方式插入带父ID数据时父表生成多ID的问题排查

解决主从表插入异常与号码存在性校验问题

看起来你现在卡在了两个关键点上:一是父表被重复插入多条记录(本该是一个父ID对应多条子表记录),二是需要在insert.php里实现插入前校验子表号码是否已存在。我来一步步帮你梳理解决思路和具体实现:

一、先修复父表重复插入的问题

主从表结构的正确插入逻辑应该是:先插入父表拿到唯一的父ID,再用这个ID批量插入所有关联的子表记录,绝对不能把父表插入的代码放在子表插入的循环里——这就是你现在父表多插ID的根源。

给你一个PHP+MySQL的典型实现示例:

// 假设你的父表名为 lottery_main,存储主记录的基础信息
// 1. 先插入父表,获取唯一父ID
$insertParentSql = "INSERT INTO lottery_main (create_time) VALUES (NOW())";
mysqli_query($conn, $insertParentSql);
$parentId = mysqli_insert_id($conn); // 拿到刚生成的父ID

// 2. 用同一个parentId插入三张子表的记录
// 处理toto_number表(假设前端提交的号码数组是$totoNums)
foreach ($totoNums as $num) {
    // 先做号码存在性校验,后面会细说逻辑
    $checkSql = "SELECT id FROM toto_number WHERE parent_id = $parentId AND number = '$num'";
    $checkResult = mysqli_query($conn, $checkSql);
    
    if (mysqli_num_rows($checkResult) === 0) {
        // 号码不存在,执行插入
        $insertSql = "INSERT INTO toto_number (parent_id, number) VALUES ($parentId, '$num')";
        mysqli_query($conn, $insertSql);
    } else {
        // 号码已存在的提示逻辑
        echo "当前记录下的Toto号码 $num 已存在,请检查";
    }
}

// 同理处理damacai_number表
foreach ($damacaiNums as $num) {
    $checkSql = "SELECT id FROM damacai_number WHERE parent_id = $parentId AND number = '$num'";
    $checkResult = mysqli_query($conn, $checkSql);
    
    if (mysqli_num_rows($checkResult) === 0) {
        $insertSql = "INSERT INTO damacai_number (parent_id, number) VALUES ($parentId, '$num')";
        mysqli_query($conn, $insertSql);
    } else {
        echo "当前记录下的Damacai号码 $num 已存在,请检查";
    }
}

// 处理magnum_number表
foreach ($magnumNums as $num) {
    $checkSql = "SELECT id FROM magnum_number WHERE parent_id = $parentId AND number = '$num'";
    $checkResult = mysqli_query($conn, $checkSql);
    
    if (mysqli_num_rows($checkResult) === 0) {
        $insertSql = "INSERT INTO magnum_number (parent_id, number) VALUES ($parentId, '$num')";
        mysqli_query($conn, $insertSql);
    } else {
        echo "当前记录下的Magnum号码 $num 已存在,请检查";
    }
}

二、号码存在性校验的两种场景

上面的示例是校验同一个父ID下的号码是否重复,如果你的需求是全局所有记录中号码不能重复,只需要去掉校验SQL里的parent_id条件就行:

// 全局校验Toto号码是否存在
$checkSql = "SELECT id FROM toto_number WHERE number = '$num'";

另外,为了避免并发场景下的重复插入(比如两个请求同时插同一个号码),建议给子表加唯一索引兜底:

  • 如果是同个父ID下唯一:给parent_id + number加组合唯一索引
  • 如果是全局唯一:直接给number加唯一索引

创建组合唯一索引的SQL示例:

ALTER TABLE toto_number ADD UNIQUE KEY idx_parent_number (parent_id, number);
ALTER TABLE damacai_number ADD UNIQUE KEY idx_parent_number (parent_id, number);
ALTER TABLE magnum_number ADD UNIQUE KEY idx_parent_number (parent_id, number);

三、快速调试建议

  1. 先去insert.php里找父表插入的代码,确保它不在子表插入的循环体内
  2. 插入前可以用var_dump($parentId)打印父ID,确认所有子表记录都用的是同一个ID
  3. 故意提交重复号码测试校验逻辑,看是否能正确拦截

内容的提问来源于stack exchange,提问作者Dharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:27:35