Добавить в корзинуПозвонить
Найти в Дзене
"Мы"-Прогер

Идентификаторы в таблицах SQL - на примере Postgres

Строки в таблицах баз данных не упорядочены, то есть, нет первой и второй строк. Например, если мы отредактируем первую строку в таблице и сохраним изменения, то она может оказаться последней: Итак, строки не упорядочены. Теперь представим обычную ситуацию: приложение на другом языке программирования, например, на C#, использует нашу базу данных. Пользователь открыл в приложении определённую строку, отредактировал её и хочет сохранить изменения. Но, так как строки не упорядочены, то при сохранении изменений приложение не может сказать базе данных: "отредактируй строку номер такую-то". Чтобы база данных поняла, какую строку надо изменять, нужно добавить в каждую строку какие-то уникальные данные (например, пронумеровать их). Столбец с данными, использующимися для различения строк между собой, обычно называется id (от слова "идентификатор"). Столбец может быть любого типа данных, но обычно используются serial, bigserial или uuid. Postgres имеет специальные типы данных для автоматической
Оглавление

Зачем нужны идентификаторы

Строки в таблицах баз данных не упорядочены, то есть, нет первой и второй строк. Например, если мы отредактируем первую строку в таблице и сохраним изменения, то она может оказаться последней:

-2

Итак, строки не упорядочены. Теперь представим обычную ситуацию: приложение на другом языке программирования, например, на C#, использует нашу базу данных. Пользователь открыл в приложении определённую строку, отредактировал её и хочет сохранить изменения. Но, так как строки не упорядочены, то при сохранении изменений приложение не может сказать базе данных: "отредактируй строку номер такую-то". Чтобы база данных поняла, какую строку надо изменять, нужно добавить в каждую строку какие-то уникальные данные (например, пронумеровать их). Столбец с данными, использующимися для различения строк между собой, обычно называется id (от слова "идентификатор"). Столбец может быть любого типа данных, но обычно используются serial, bigserial или uuid.

Типы данных serial и bigserial

Postgres имеет специальные типы данных для автоматической нумерации строк - достаточно создать колонку с типом данных serial или bigserial, и эта колонка будет содержать номер строки, проставляемый автоматически.

Для этого найдём во вкладке Database созданную ранее таблицу "students" (если у вас её нет, подойдёт любая другая созданная вами таблица). Нажмём на неё правой кнопкой мыши и выберем "Modify Table...":

-3

Откроется уже знакомое нам окно создания/редактирования таблицы. Нажмём правой кнопкой на плюсик и выберем "Column":

-4

Добавим к таблице колонку с названием id типа данных serial с комментарием "Автонумерация строк":

-5

Нажмём "OK". Теперь откроем нашу таблицу, щёлкнув на неё дважды. В ней появился новый столбец с номерами:

-6

Если таблица уже была открыта, нажмём кнопку Reload Page:

-7

Проверка

Изменим отчество у ученика, стоящего первым по порядку, и зальём изменения в базу:

-8

Видимый порядок строк изменился, но номера на строках остались прежними:

-9

Мы можем принудительно упорядочить видимые нами строки, нажав на этот значок:

-10

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

Тип данных bigserial отличается от serial только тем, что имеет больший диапазон значений. То есть, serial ограничен примерно 2 миллиардами, а bigserial можно пользоваться, даже если строк в таблице будет больше, чем 2 миллиарда.

Тип данных uuid

Чтобы различать строки между собой, необязательно их нумеровать. Достаточно хранить в каждой из них некое уникальное значение, например, что-то случайное, что вряд ли будет повторяться. Случайную последовательность последовательность байтов и представляет собой uuid. Слово uuid означает "Universally Unique Identifier" ("Универсальный уникальный идентификатор"). Они есть в разных языках программирования и могут называться также uniqueidentifier (MS SQL Server) или Guid (C#).

При генерации значения uuid настолько случайны, что с очень большой вероятностью уникальны на всей Земле. То есть, если ваш компьютер сгенерировал uuid, то вряд ли у кого-то ещё будет такой же. Вероятность совпадения больше нуля, но настолько мала, что ей обычно можно пренебречь. Более того, при работе с uuid обычно достаточно учитывать только первые 3 символа. То есть, когда мы сравниваем два uuid глазами, достаточно сравнить первые 3 символа. Вероятность ошибиться не больше 1 / 16 в кубе = 1 / 4096, то есть, в среднем 1 раз в несколько лет.

Создадим колонку id типа uuid. Для этого сначала нужно удалить старую колонку id. Найдём таблицу students в дереве базы данных и раскроем её. Далее раскроем список колонок:

-11

Выделим колонку id и нажмём Delete на клавиатуре. Откроется окошко с подтверждением:

-12

Нажмём OK - колонка будет удалена.

Теперь нажмём правой кнопкой на нашей таблице и выберем "Modify Table...". Откроется уже знакомое нам окно создания/редактирования таблицы. Внесём изменения: нажмём на плюсик, Column, чтобы добавить новую колонку:

-13

Зададим ей название id, комментарий "Случайный идентификатор" и тип данных uuid:

-14

Обновим таблицу:

-15

Столбец с типом данных uuid не заполняется автоматически. Для его заполнения нужно указать конкретное значение. Раздобыть его можно в интернете, набрав в поиске "generate uuid". Например, тут: https://guidgenerator.ru/ Вставим значения в пустые ячейки столбца id и сохраним данные:

-16

Далее

В следующей статье мы рассмотрим, как заставить базу данных генерировать id самостоятельно:

Оглавление: