首页 > 解决方案 > pg_restore 如何处理 GENERATED ALWAYS AS IDENTITY 列?

问题描述

如果我pg_restore --data-only进入这样的表:

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

列会发生什么id?是被GENERATED ALWAYS忽略并pg_dump插入了文件中的 id,还是生成了新的 id?

pg_restore文档说,在--data-only旗帜下:

如果存档中存在表数据、大对象和序列值,则会恢复。

这里的“序列值”是否包括GENERATED ALWAYS AS IDENTITY

我正在使用 Postgres 11,但很高兴知道这种行为是否与所有普遍支持的版本 (>=9.5) 相同。

标签: postgresql

解决方案


使用INSERTOVERRIDING 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);

推荐阅读