如何使用uniqid()更新许多行,使其在php中唯一

时间:2019-05-17 07:01:59

标签: php pdo foreach unique

我在mysql中创建了一个新列,该列将为数据库中的所有元素存储一个唯一值。

现在,我想使用uniqid()用此唯一值填充所有行。

但是由于该函数使用了microtime(),所以我无法一起更新所有行。

我该怎么办?

$unique_id = uniqid();

$sql = "UPDATE posts SET unique_id = :unique_id";
$stmt = $pdo->prepare($sql);
$stmt->execute(['unique_id' => $unique_id]);

此代码为所有行更新相同的值。
每行如何唯一?

4 个答案:

答案 0 :(得分:1)

尝试以下代码

SET @r := 0;
UPDATE  posts 
SET unique_id = (@r := @r + 1)
ORDER BY RAND();

答案 1 :(得分:0)

尝试一下,

update posts set unique_id = @i:=@i+1 order by rand();

数字现在将随机分配给行,但是每行都有一个唯一的值。

答案 2 :(得分:0)

uniqid('', TRUE),

您可以将uniqid与熵结合使用,以使其在时间上更加敏感,以减少重复的机会,但请记住一件事:

  

此函数不能保证返回值的唯一性。以来   大多数系统通过NTP或类似方法调整系统时钟,系统时间为   不断变化。因此,此功能可能会   不返回进程/线程的唯一ID。使用more_entropy   增加唯一性的可能性。

您还可以做一个随机前缀,例如:

uniqid(mt_rand(), TRUE);

这将消除所有产生重复项的机会。

您将使用随机前缀+熵敏感度。即使您的脚本运行的速度如此之快,即使时间戳以毫秒为单位,生成的值也将是唯一的。

您的代码存在的问题是,您一次将uniqid()函数分配给一个变量,并且从那里得到的重复当然是因为您使用了该变量:

尝试以下代码:

$sql = "UPDATE posts SET unique_id = uuid()";
$stmt = $pdo->prepare($sql);
$stmt->execute();

答案 3 :(得分:0)

因此,经过一些尝试,我使用uniqid()遇到了自己的解决方案。
这是我的代码,评论如下:

// Selecting all the posts
$sql = "SELECT id, pro_key FROM posts";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$posts = $stmt->fetchAll();

// Looping through all the results and updating them one by one with a delay of 1 second between the updates
foreach($posts as $post) {
  $sql = "UPDATE posts SET unique_id = :unique_id WHERE id = :id";
  $stmt = $pdo->prepare($sql);
  $stmt->execute(['id' => $post->id, 'unique_id' => uniqid()]);
  // delay
  sleep(1);
}

希望这会有所帮助。