Каков наилучший способ реализации ключа автоинкремента, который является «локальным» для некоторого другого столбца (, т. Е. comment
идентификатор начинается с 1 для каждого блога post
)?
Например, в GitHub номер выпуска является локальным для репозитория: проблема № 1 означает, что это первая проблема вашего репо, и облегчает жизнь всем, поскольку не приходится использовать более длинные и, казалось бы, случайные идентификаторы.
Например, учитывая:
CREATE TABLE post (
id bigserial PRIMARY KEY
, title varchar(255) NOT NULL
);
CREATE TABLE "comment" (
post_id bigint REFERENCES post NOT NULL
, id bigint NOT NULL
, "comment" text NOT NULL
, PRIMARY KEY (id, post_id)
);
Одним из способов решения проблемы является вычисление максимального значения id
всех комментариев для данного post_id
:
INSERT INTO post (id, title) VALUES (1, 'first post');
INSERT INTO "comment" (post_id, id, "comment") VALUES (
1,
(SELECT COALESCE(MAX(id) + 1, 1) FROM "comment" WHERE post_id = 1 LIMIT 1),
'1st comment of 1st post'
);
^ Это похоже на клудж, и я также беспокоюсь о возможных проблемах с сериализуемостью.
Интересно, как лучше всего это реализовать (под PostgreSQL)? Спасибо!