如何解决在 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
查询表时,它仍然只显示我以前的 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 和一个没有一个 1 的版本) -
用
DROP SEQUENCE <sequenceName_seq>;
删除多余的序列(只有末尾没有1的可以删除) -
刷新 pgAdmin4
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。