Как pg_restore обрабатывает GENERATED ВСЕГДА как столбцы IDENTITY? - PullRequest
1 голос
/ 03 марта 2020

Если я pg_restore --data-only в таблицу, подобную этой:

CREATE TABLE foo (
    id int4 NOT NULL GENERATED ALWAYS AS IDENTITY,
    bar varchar
);

, что происходит со столбцом id? GENERATED ALWAYS игнорируется и вставляются идентификаторы из файла pg_dump, или генерируются новые идентификаторы?

Документы pg_restore, скажем, под флагом --data-only:

Табличные данные, крупные объекты и значения последовательности восстанавливаются, если они присутствуют в архиве.

Включает ли сюда "значения последовательности" GENERATED ALWAYS AS IDENTITY?

Я использую Postgres 11, но было бы интересно узнать, было ли это поведение одинаковым со всеми обще поддерживаемыми версиями (> = 9.5).

1 Ответ

0 голосов
/ 03 марта 2020

С INSERT вам нужно использовать OVERRIDING SYSTEM VALUE, если вы хотите отменить значение по умолчанию из столбца идентификаторов, но с COPY таких ограничений нет.

Это упрощает pg_dump. Вот пример того, как выглядит дамп таблицы со столбцом идентификаторов:

/* section = pre-data */

CREATE TABLE laurenz.identity (
    id integer NOT NULL,
    value text NOT NULL
);

ALTER TABLE laurenz.identity ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
    SEQUENCE NAME laurenz.identity_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1
);

/* section = data */

COPY laurenz.identity (id, value) FROM stdin;
1   one
2   two
3   three
-10 weird
-5  also weird
\.

/* section = post-data */

SELECT pg_catalog.setval('laurenz.identity_id_seq', 3, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...