MySQL插入地理坐标点后调整后续排序序号的实现问题
MySQL插入坐标点后排序字段自动顺延解决方案
问题根因
现有实现逻辑存在两个核心问题:
- 执行顺序错误:先插入新数据再全量更新排序字段,数据量大时性能极低,同时并发场景下极易出现排序冲突
- 存在SQL注入风险:直接拼接SQL参数未做过滤,有数据泄露和被篡改的风险
实现逻辑
无需遍历全表重排排序字段,仅需两步操作即可实现需求:
- 先把当前
id_pdf分组下所有排序值大于等于你要插入的目标ord值的记录,ord统一加1 - 直接插入新记录,ord设置为你的目标值即可
可通过事务包裹两条SQL保证操作原子性,避免部分执行成功导致数据异常。
修正后代码示例
// 要插入的目标ord值为$target_ord,所属pdf id为$id_pdf // 开启事务 mysqli_begin_transaction($con); try { // 第一步:所有>=目标ord的现有记录ord+1 $update_stmt = mysqli_prepare($con, "UPDATE `editare_coordonate` SET `ord` = `ord` + 1 WHERE `id_pdf` = ? AND `ord` >= ?"); mysqli_stmt_bind_param($update_stmt, "ii", $id_pdf, $target_ord); mysqli_stmt_execute($update_stmt); // 第二步:插入新点 $insert_stmt = mysqli_prepare($con, "INSERT INTO `editare_coordonate` (`id_pdf`,`ord`,`x`,`y`) VALUES (?, ?, '', '')"); mysqli_stmt_bind_param($insert_stmt, "ii", $id_pdf, $target_ord); mysqli_stmt_execute($insert_stmt); // 提交事务 mysqli_commit($con); } catch (Exception $e) { // 出现错误回滚 mysqli_rollback($con); throw $e; }
原问题参考说明
原有表数据示例:
实现效果示例:
内容的提问来源于stack exchange,提问作者CoderCoder42
相关产品推荐
相关产品推荐

