Особенности первичных ключей в PostgreSql

Сразу следует подчеркнуть, что независимо от ситуации хорошей практикой является использование в качестве ключа дополнительного поля ID типа serial.

Работа с первичными ключами в PostgreSql имеет ряд особенностей. Мы рассмотрим некоторые из них.

Следует подчеркнуть, что в PostgreSql первичный ключ может быть представлен только в виде 1-ного поля. Таким образом, PostgreSql явно не поддерживает составные ключи. Такой ключ должен быть локализован с помощью дополнительного поля ID квази типа serial, а поля, образующие составной ключ, должны не допускать значение NULL.

Если желательно, чтобы ключ был представлен реальным полем, то везде, где это возможно тип поля следует выбирать строковым, например, Номер зачетной книжки студента, хоть он и выглядит как целое число. Однако практика показала, что в тех случаях, когда в качестве первичного ключа таблицы выступают строковые данные, например Фамилия, лучше использовать искусственный первичный ключ - ID, создав дополнительную колонку и определив тип ее элементов как serial. Это сократит затраты при работе с несколькими склеиваемыми таблицами (см. ниже).

Если же ключ представить с типом поля integer, то при попытке ввода из программного приложения новой записи возникнут конфликты с PostgreSql.

Следует подчеркнуть, что при переносе БД из некоторой СУБД, например Access, в PostgreSql тип данных полей, аналогичных AUTO_INCREMENT, преобразуется в тип integer, что приводит к проблемам при добавлении новых данных. Если перепроетирование БД с вводом новых полей типа serial не представляется целесообразным, что обычно имеет место, то следует выполнить замену типа таких полей с integer на serial.

Однако прямая замена типа поля integer на тип serial в свойствах поля в PgAdmin III недоступна.

Для перевода в PgAdmin III типа поля integer в serial или bigserial следует сначала для требуемого ключевого поля таблицы создать последовательность (Sequence), в которой задать закон приращения значений последовательности. Имя последовательность формируется, как правило по схеме “таблица_колонка_seq”. Для таблицы Groups получим Groups_GrNo_seq.

Рисунок 2.16 – Настройка новой последовательности

Эта последовательность сохраняется.

Рисунок 2.17 – Сохраненные последовательности

Далее формируем SQL-запрос на изменение типа

ALTER TABLE "Groups"

ALTER COLUMN "GrNo" SET DEFAULT nextval('"Groups_GrNo_sec"')

и выполняем его (рисунок 2.18)

Рисунок 2.18 – Сохраненные последовательности

Теперь в свойствах колонки можно увидеть, что задано значение по умолчанию (рисунок 2.18)

Рисунок 2.19 – В поле Значение по умолчанию задана требуемая последовательность