在 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_seqpublic.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

  1. 运行 SELECT c.relname FROM pg_class c WHERE c.relkind = 'S'; 并识别重复序列(即末尾有一个版本和一个没有 1 的版本)

  2. 删除带DROP SEQUENCE <sequenceName_seq>;的多余序列(只能删除末尾没有1的)

  3. 刷新 pgAdmin4