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

如何为多个数据表的id列设置不同的PHP uniqid()值

解决PHP更新多表id时每行id重复的问题

你的问题出在UPDATE语句没有添加WHERE条件——每次循环执行更新时,都会把当前表的所有行id统一替换成刚生成的uniqid()值,最终整个表的id都会变成最后一次循环生成的那个值。

要给每行设置不同的id,必须在更新时精准定位到单一行,具体修改方案如下:

核心改动点

  • 查询时只获取表中每行的原有唯一标识(比如原有id),不用查所有列
  • 在UPDATE语句中添加WHERE子句,通过原有唯一标识定位到当前行
  • 执行更新时同时传入新id和原有标识参数

修正后的代码

$arr = ['lorem', 'ipsum', 'dolor'];  // 表名数组
foreach($arr as $tb){
    // 只查询原有id列,提升性能
    $st = $db->prepare("SELECT id FROM " . $tb);
    $st->execute();
    // 直接获取id列的一维数组,简化后续循环
    $rowIds = $st->fetchAll(PDO::FETCH_COLUMN, 0);

    foreach($rowIds as $oldId){
        $newId = uniqid();
        // 添加WHERE条件,仅更新当前行
        $updateSql = "UPDATE " . $tb . " SET id = :new_id WHERE id = :old_id";
        $stb = $db->prepare($updateSql);
        $stb->execute([
            ":new_id" => $newId,
            ":old_id" => $oldId
        ]);
    }
}

额外说明

  • 如果你的表不是用id作为原有唯一主键,把WHERE子句里的id替换成对应表的唯一标识列即可(比如user_id、order_id等)
  • 若需要更高的唯一性,可以给uniqid()加第二个参数true,生成23位的唯一值:uniqid('', true)
  • 只查询需要的列(而非SELECT *)能减少内存占用,提升脚本运行效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:50:23