Как обновить множество строк с помощью uniqid (), сделав их уникальными в php

Я создал новый столбец в 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 ответа


попробуйте с кодом ниже

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

Попробуй это ,

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

Числа теперь будут случайным образом присваиваться строкам, но каждая строка имеет уникальное значение.


uniqid('', TRUE),

Вы можете использовать uniqid с энтропией, чтобы сделать ее более чувствительной во времени, чтобы еще больше сузить вероятность дубликатов, но помните одну вещь:

Эта функция не гарантирует уникальности возвращаемого значения. Поскольку большинство систем настраивают системные часы по NTP или тому подобное, системное время постоянно меняется. Следовательно, возможно, что эта функция не возвращает уникальный идентификатор для процесса / потока. Используйте more_entropy, чтобы увеличить вероятность уникальности.

Что вы можете сделать, это поставить случайный префикс, например:

uniqid(mt_rand(), TRUE);

Это исключит все шансы на создание дубликата.

Вы собираетесь использовать случайный префикс + энтропийную чувствительность. Сгенерированное значение будет уникальным, даже если ваш скрипт выполняется так быстро, что временная метка оказывается одинаковой даже в миллисекундах.

Проблема с вашим кодом состоит в том, что вы используете uniqid() один раз, присваивая ее переменной, и оттуда вы получите дубликаты, конечно, потому что вы используете эту переменную:

Попробуйте этот код:

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

Поэтому после некоторых попыток я наткнулся на собственное решение, используя 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);
}

Надеюсь это поможет.


Есть идеи?

10000