使用数组方式插入带父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);
三、快速调试建议
- 先去
insert.php里找父表插入的代码,确保它不在子表插入的循环体内 - 插入前可以用
var_dump($parentId)打印父ID,确认所有子表记录都用的是同一个ID - 故意提交重复号码测试校验逻辑,看是否能正确拦截
内容的提问来源于stack exchange,提问作者Dharma
相关产品推荐
相关产品推荐

