MySql Вставить Выбрать uuid () - PullRequest
8 голосов
/ 10 июня 2011

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

`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

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

Ответы [ 5 ]

17 голосов
/ 10 июня 2011

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

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

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

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

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

Мой плохой.

3 голосов
/ 05 января 2017

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

2 голосов
/ 10 июня 2011

Как мне дать команду MySql создать другую строку uuid foreach?

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

1 голос
/ 01 августа 2018

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

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

0 голосов
/ 11 марта 2013

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

...