@shupike

Нужен ли первичный ключ в таблицах PostgreSQL?

Добрый день! Такой вопрос - пытаюсь старую базу MS Access перевести в PostgreSQL (тупо руками пересоздаю таблицы и поля) и вот что не понял - у меня есть таблица в MS Access без ключевого поля, то есть просто служит для связанности при запросах. Я создал аналогичную таблицу в pgadmin, но вносить в нее данные без первичного ключа не удается. Получается, что нужно добавить в любом случае поле первичного ключа и вручную потом отслеживать его значение при добавлении/удалении записей в этой таблице? А почему все это работает без первичного ключа в MS Access? Спасибо.
  • Вопрос задан
  • 172 просмотра
Пригласить эксперта
Ответы на вопрос 3
AshBlade
@AshBlade
Просто хочу быть счастливым
Почему работает в Access - потому что это другая БД. Поведение может различаться.

Что касается обязательности ключевого поля - странно. Таблицу можно создать и без него.

Предполагаю, что эта таблица ссылается через references на столбец другой таблицы. В таком случае, на последнее должно стоять ограничение уникальности - иначе как понять на какую строку ссылаться.
Ответ написан
Вот пример создания таблицы point_user из одного из моих проектов, которая состоит из двух полей, связывающих две другие таблицы (point и user) отношениями many-to-many. В этих двух полях содержатся id записей из тех двух таблиц. Первичный ключ тут просто составной, состоящий из обоих полей. И не надо его как-то специально отслеживать.

create table point_user
(
    point_id uuid not null
        constraint fk_413312bc028cea2
            references point
            on delete cascade,
    user_id  uuid not null
        constraint fk_413312ba76ed395
            references "user"
            on delete cascade,
    primary key (point_id, user_id)
);

create index idx_413312ba76ed395
    on point_user (user_id);

create index idx_413312bc028cea2
    on point_user (point_id);
Ответ написан
@mrfreeman2
Первичный ключ — это свойства строки, которые однозначно идентифицируют эту запись.
Первичное значение — не обязательно 1 поле, и не обязательно придумывать новое поле, вероятнее всего, то, что есть уже достаточно, и ключ можно составить из того, что есть.
Под капотом первичный индекс — это такой же индекс, но значения в нем уникальны и не могут быть null.
В целом без первичного ключа можно, но первичный ключ нужен для реплицирования данных, для миграции данных при обновлении версии pg и банально для предотвращения появления дублей записи. Итог: лучше его иметь, чем не иметь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы