PostgreSQL приведение типа к серийному номеру не работает при создании нового поля - PullRequest
0 голосов
/ 07 мая 2020

Контекст

Я хотел бы создать PostgreSQL MATERIALIZED VIEW с серийным номером, созданным на лету, но типом, приведенным к SERIAL кажется, не работает (на самом деле, это не работает, даже если я отбрасываю часть, которая создает представление, и если я беру только внутреннюю инструкцию SELECT):

CREATE MATERIALIZED VIEW schema.view_m AS (
  SELECT
    1::SERIAL AS id,
    2::INTEGER as user_id 
)

Если я заменю SERIAL на INTEGER, он заработает, поэтому я думаю, есть некоторые причины, по которым он не работает с SERIAL.

Мне нужно настроить это поле id на- the-fly как истинный идентификатор (я имею в виду с последовательностью, связанной с ним, уникальной, не нулевой и т. д.):

CREATE MATERIALIZED VIEW schema.view_m AS (
  SELECT
    -- obviousely replace "__type__cast__goes__here__" by the right statement here:
    1::__type__cast__goes__here__ AS id, 
    2::INTEGER as user_id 
)

Что-то похожее на this , но для PostgreSQL.

Вопрос

Знаете ли вы, каковы основные технические причины этого?

Я использую PostgreSQL 10.12.

1 Ответ

1 голос
/ 07 мая 2020

Используйте int. serial на самом деле не тип. Это способ сказать, что данный тип (int) генерируется автоматически. Это очевидно, когда вы определяете отношения внешнего ключа. Тип внешнего ключа должен соответствовать первичному ключу, но int будет использоваться для ссылки на serial.

В Postgres 10+ решение состоит в том, чтобы избежать serial - это рекомендуется и по другим причинам. Новый синтаксис делает это более понятным:

id int primary key generated always as identity

Автоматическое c поколение не зависит от имени типа.

...