在 PostgreSQL / pgAdmin4 中从串行数据类型切换到身份数据类型后出现重复列
Duplicate column after switching from serial to identity datatype in PostgreSQL / pgAdmin4
我正在使用 serial
数据类型创建一个 PRIMARY KEY
列,但最近被告知这已经过时,我应该改用 GENERATED ALWAYS AS IDENTITY
。我使用 pgAdmin 4 通过将数据类型更改为整数然后添加生成的身份来修复它。这行得通,但我对结果有点困惑,因为 SQL 代码现在显示 2 个 id 列而不是 1 个:
CREATE TABLE public.names
(
id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
name character varying(128) COLLATE pg_catalog."default",
CONSTRAINT names_pkey PRIMARY KEY (id)
)
然而,当我用 SELECT * FROM names
查询 table 时,它仍然像以前一样只显示 1 个 id 列。
如果能帮助我理解出了什么问题以及如何解决它,我将不胜感激。
经过长时间的搜索,我找到了以下内容:
确实只有一列可以用psql确认。但是使用 bash 中的命令 pg_dump -st names <databasename>
我注意到有 2 个序列被定义为与 id 列相关联:public.names_id_seq
和 public.names_id_seq1
.
这也可以通过 psql 中的 运行 SELECT c.relname FROM pg_class c WHERE c.relkind = 'S';
来确认,其中两个序列都出现了。
如果尝试删除 public.names_id_seq1
,则会收到错误 ERROR: cannot drop sequence apis_id_seq1 because column id of table apis requires it
。
解决方案是用DROP SEQUENCE names_id_seq;
删除第一个序列刷新pgAdmin4后第二列消失了。
TL;DR
运行 SELECT c.relname FROM pg_class c WHERE c.relkind = 'S';
并识别重复序列(即末尾有一个版本和一个没有 1 的版本)
删除带DROP SEQUENCE <sequenceName_seq>;
的多余序列(只能删除末尾没有1的)
刷新 pgAdmin4
我正在使用 serial
数据类型创建一个 PRIMARY KEY
列,但最近被告知这已经过时,我应该改用 GENERATED ALWAYS AS IDENTITY
。我使用 pgAdmin 4 通过将数据类型更改为整数然后添加生成的身份来修复它。这行得通,但我对结果有点困惑,因为 SQL 代码现在显示 2 个 id 列而不是 1 个:
CREATE TABLE public.names
(
id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
name character varying(128) COLLATE pg_catalog."default",
CONSTRAINT names_pkey PRIMARY KEY (id)
)
然而,当我用 SELECT * FROM names
查询 table 时,它仍然像以前一样只显示 1 个 id 列。
如果能帮助我理解出了什么问题以及如何解决它,我将不胜感激。
经过长时间的搜索,我找到了以下内容:
确实只有一列可以用psql确认。但是使用 bash 中的命令 pg_dump -st names <databasename>
我注意到有 2 个序列被定义为与 id 列相关联:public.names_id_seq
和 public.names_id_seq1
.
这也可以通过 psql 中的 运行 SELECT c.relname FROM pg_class c WHERE c.relkind = 'S';
来确认,其中两个序列都出现了。
如果尝试删除 public.names_id_seq1
,则会收到错误 ERROR: cannot drop sequence apis_id_seq1 because column id of table apis requires it
。
解决方案是用DROP SEQUENCE names_id_seq;
删除第一个序列刷新pgAdmin4后第二列消失了。
TL;DR
运行
SELECT c.relname FROM pg_class c WHERE c.relkind = 'S';
并识别重复序列(即末尾有一个版本和一个没有 1 的版本)删除带
DROP SEQUENCE <sequenceName_seq>;
的多余序列(只能删除末尾没有1的)刷新 pgAdmin4