MySql Вставить Выберите uuid()

Скажем, у вас есть таблица:

`item`

С полями:

`id` VARCHAR( 36 ) NOT NULL
,`order` BIGINT UNSIGNED NOT NULL

И:

Unique(`id`)

И вы звоните:

INSERT INTO `item` (
`item`.`id`,`item`.`order`
) SELECT uuid(), `item`.`order`+1

MySql вставит один и тот же uuid во все вновь созданные строки.

Итак, если вы начнете с:

aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa, 0
bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb, 1

Вы получите:

aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa, 0
bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb, 1
cccccccc-cccc-cccc-cccc-cccccccccccc, 1
cccccccc-cccc-cccc-cccc-cccccccccccc, 2

Как мне заставить MySql создать другой uuid для каждой строки?

Я знаю, что в MSSQL следующее работает так, как ожидалось:

INSERT INTO item (
id,[order]
) SELECT newid(), [order]+1

н.б. Я знаю, что могу ВЫБРАТЬ результаты, просмотреть их и выполнить отдельную команду INSERT для каждой строки из моего PHP-кода, но я не хочу этого делать. Я хочу, чтобы работа выполнялась на сервере базы данных, где она должна выполняться.


person Richard    schedule 10.06.2011    source источник
comment
Вы уверены, что он возвращает одно и то же значение для каждой строки? Я ожидаю, что большинство символов будут одинаковыми в каждом значении, когда вы вызываете UUID() таким образом, поэтому при визуальном сканировании они могут выглядеть одинаково, но каждый из них все равно будет уникальным, если вы внимательно посмотрите.   -  person Ike Walker    schedule 10.06.2011
comment
Уверены ли вы? Я попробовал аналогичный тест - я получил разные UUID.   -  person Rick James    schedule 30.09.2018


Ответы (5)


Оказывается, uuid() генерирует разные uuid для каждой строки.

Но вместо того, чтобы генерировать все фрагменты случайным образом, как я обычно ожидал, MySql, похоже, генерирует только 2-й фрагмент случайным образом. Предположительно, чтобы быть более эффективным.

Таким образом, на первый взгляд uuid кажутся идентичными, хотя на самом деле MySql изменил 2-й фрагмент. например

cccccccc-cccc-cccc-cccc-cccccccccccc
ccccdddd-cccc-cccc-cccc-cccccccccccc
cccceeee-cccc-cccc-cccc-cccccccccccc
ccccffff-cccc-cccc-cccc-cccccccccccc

Я предполагаю, что если произойдет столкновение, он попытается снова.

Виноват.

person Richard    schedule 10.06.2011
comment
Это связано со спецификацией UUID, которую использует MySQL. Большая часть строки основана на MAC-адресе сервера, который, по-видимому, в вашей настройке не будет меняться от одного INSERT к другому. Остальная часть строки зависит от времени. UUID не являются случайными. - person Tom Wright; 12.07.2011
comment
Кроме того, шансы на столкновение фактически равны нулю (из-за элемента времени, присущего этому режиму генерации UUID), но если бы когда-либо было столкновение, оно не было бы обнаружено, потому что вы не используете ключи в своих полях. . - person Tom Wright; 12.07.2011
comment
сэкономил мне часы! Спасибо :D - person Björn; 13.07.2020

Попробуйте использовать MID(UUID(),1,36) вместо uuid().

person Lâm Nguyễn    schedule 05.01.2017

Как мне заставить MySql создать другую строку uuid для каждого?

MySQL не разрешает использовать выражения в качестве значения по умолчанию. Вы можете обойти это, разрешив поле быть нулевым. Затем добавьте триггеры вставки/обновления, которые при нулевом значении , установите для поля значение uuid().

person Denis de Bernardy    schedule 10.06.2011

Функция MySQL UUID() генерирует UUID версии 1, которые разделены на поля времени, последовательности и узла. Если вы вызовете его на одном узле, будут отличаться только несколько битов в поле времени; это называется временной уникальностью. Если вы вызовете его на разных узлах в одно и то же время, поля узлов будут разными; это называется пространственной уникальностью. Сочетание этих двух факторов очень эффективно и дает гарантию универсальной уникальности, но также приводит к утечке информации о том, когда и где был создан каждый UUID версии 1, что может быть проблемой безопасности. Упс.

UUID V4, как правило, сейчас более популярны, потому что они хешируют эти данные (и многое другое) вместе и, таким образом, ничего не утекают, но вам понадобится другая функция, чтобы получить их — и остерегайтесь того, что они сделают с производительностью, если у вас есть высокая громкость INSERT; MySQL (по крайней мере, на данный момент) не очень хорошо индексирует (псевдо) случайные значения, поэтому V1 - это то, что они вам дают.

person StephenS    schedule 31.07.2018
comment
Ну, у V1 такая же плохая производительность, если вы переставите биты. - person Rick James; 30.09.2018
comment
Вставить V4 UUID довольно просто, даже без поддержки бэкэнда: > stackoverflow.com/questions/61110221/ - person J_H; 12.04.2020

Сначала сгенерируйте строку uniq с помощью функции php uniqid() и вставьте в идентификатор поле.

person HYDER ALI    schedule 11.03.2013