Не так давно столкнулся с uuid, когда изучал форматы отчетности в xml. uuid это такой хитрый номер состоящий из последовательности в 8-4-4-4-12 символов в 16-ричной системе исчисления. Прелесть такого номера в том, что он считается всегда уникальным.
Вы только представьте! В любом списке можно использовать uuid вместо инкрементального счетчика и пересечений не случится!
Тут нужно сказать, что далеко не всегда можно обойтись без инкремента. Например, прямые и обратные последовательности точно потребуют такого инкремента. Но в то же самое время можно использовать поле datetime вместо инкремента или другие возможности баз данных (гуру конечно в курсе), а я узнаю со временем :-)
Сгенерировать uuid можно онлайн, например на сайте uuidgen.org, можно формулой в excele (можно посмотреть в подвале этой статьи), а можно функцией в potgreSQL. Сайты подсказки предлагают вставить функцию
uuid_generate_v4()
в запросник и запустить выполнение. Действительно, так мы получим в выводе один uuid. Не сильно то нам это поможет, правда?
Оказывается можно вставить функцию в скрипт определения столбца:
id uuid NOT NULL DEFAULT gen_random_uuid(),
вроде как если пусто, то по умолчанию используй функцию
gen_random_uuid()
Кстати, это вторая функция генератора uuid в postgreSQL.
Вот, что важно и интересно, не начнут ли пересоздаваться uuid при каждом изменении строки в базе данных. Ответ кроется в смысле функции - "примени если пусто". Иначе говоря uuid сгенерированный раз останется навсегда. Выходит, что переживать о хаотичном изменении uuid не стоит.
Однако, я подумал, раз я могу задать функцию по умолчанию в скрипте, то нужно проверить, могу ли я задать это в графическом интерфейсе pgadmin и будет ли это работать?
Ответ - работать будет ещё как. Достаточно разместить gen_random_uuid() в поле "по умолчанию" и генератор начнет работать как только мы будем добавлять новые строки. Не обратил внимания как себя ведут уже созданные строки с NULL в id. Но проверить это Вы сможете сами. Я же перезаполнил данные через drop table/create table и задача с uuid была решена.
Про EXCEL
На мой взгляд идентификатор uuid удобно собирать из блоков по 4 символа в шестнадцатеричной системе. Напомню, что uuid v4 состоит из последовательности в 8-4-4-4-12 x16 символов, таким образом, что бы сгенерировать uuid нам нужно произвести генерацию числа в диапазоне от 4096 до 65535 восемь раз.
Самое маленькое четырехразрядное число в системе x16 - 1000, что в переводе на x10 дает нам число 4096. Это мы используем как начальное значение для диапазона. Самое большое число в x16 в системе FFFF, что в переводе на x10 дает нам число 65535. Это мы используем как конечное значение для диапазона.
Excel умеет генерировать десятичные числа, а ещё он умеет конвертировать их в шестнадцатеричные. Нам потребуется использовать оба умения, а значит функции СЛУЧМЕЖДУ() и ДЕС.В.ШЕСТН()
Не много поэкспериментировав легко вывести такую формулу:
=ДЕС.В.ШЕСТН(СЛУЧМЕЖДУ(4096;65535))&ДЕС.В.ШЕСТН(СЛУЧМЕЖДУ(4096;65535))&"-"&ДЕС.В.ШЕСТН(СЛУЧМЕЖДУ(4096;65535))&"-"&ДЕС.В.ШЕСТН(СЛУЧМЕЖДУ(4096;65535))&"-"&ДЕС.В.ШЕСТН(СЛУЧМЕЖДУ(4096;65535))&"-"&ДЕС.В.ШЕСТН(СЛУЧМЕЖДУ(4096;65535))&ДЕС.В.ШЕСТН(СЛУЧМЕЖДУ(4096;65535))&ДЕС.В.ШЕСТН(СЛУЧМЕЖДУ(4096;65535))