postgresql - 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) 相同。
解决方案
使用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);
推荐阅读
- java - 为什么休眠会产生不必要的约束?
- java - 如何在 IntelliJ 中查看来自 JDK 的特定 Java 源代码文件?
- python - 无法为 postgres 12 安装 plpython
- go - 带有 MySQL 驱动程序的 Golang
- rust - 没有预建的 wasm-opt 二进制文件
- kotlin - 为什么我无法在新版本的 IntelliJ Idea 中运行我的旧 Kotlin 程序?
- javascript - 下拉列表选项选择不生成第二个下拉列表选项
- typescript - 量角器 - 从下拉菜单中选择项目
- sms - 使用 C# SDK 接收文本
- pyspark - 加载了不同列类型的数据框,以及如何将 ArrayType 列转换为另一个