Как обновить множество строк с помощью uniqid (), сделав их уникальными в php - PullRequest
0 голосов
/ 17 мая 2019

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

1 голос
/ 17 мая 2019

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

SET @r := 0;
UPDATE  posts 
SET unique_id = (@r := @r + 1)
ORDER BY RAND();
0 голосов
/ 17 мая 2019

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

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

0 голосов
/ 17 мая 2019
uniqid('', TRUE),

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

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

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

uniqid(mt_rand(), TRUE);

Это исключит любую возможность создания дубликата.

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

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

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

$sql = "UPDATE posts SET unique_id = uuid()";
$stmt = $pdo->prepare($sql);
$stmt->execute();
0 голосов
/ 17 мая 2019

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

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

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

...