Postgresql отслеживает серийный номер по идентификатору в другом столбце

#postgresql

#postgresql

Вопрос:

Итак, я пытаюсь создать базу данных, в которой могут храниться видеоролики из продуктов, но я намерен добавить несколько миллионов из них. Поэтому, очевидно, я хочу, чтобы производительность была как можно лучше.

Я хотел добиться следующего:

 BIGINT     | SMALLSERIAL | VARCHAR(30)
product_id | video_id    | video_hash
1            1             Dkfjoie124
1            2             POoieqlgkQ
1            3             Xd2t9dakcx
2            1             Df2459Afdw
  

Однако, когда я вставляю новое видео для продукта:

 INSERT INTO TABLE (product_id, video_hash) VALUES (2, DSpewirncS)
  

Я хочу, чтобы произошло следующее:

 BIGINT     | SMALLSERIAL | VARCHAR(30)
product_id | video_id    | video_hash
1            1             Dkfjoie124
1            2             POoieqlgkQ
1            3             Xd2t9dakcx
2            1             Df2459Afdw
2            2             DSpewirncS
  

Произойдет ли это, когда я установлю тип столбца для video_id на SMALLSERIAL ? Потому что я боюсь, что он вставит другое значение (самое высокое во всем столбце), чего я не хочу.

Спасибо.

Ответ №1:

Нет, серийный номер привязан к последовательности, и он не сбрасывается без указания этого.

Но если вам нужен порядковый номер для видео по продуктам, вы можете запросить таблицу для ее создания с помощью row_number() функции window.

 SELECT product_id,
       row_number() OVER (PARTITION BY product_id
                          ORDER BY video_id) video_ordinal,
       video_hash
       FROM table;
  

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