如何为多个数据表的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
相关产品推荐
相关产品推荐

