如何将现有类型从“bigint”更改为“bigserial”?

Dav*_*ers 3 postgresql identity postgresql-10

我有一个具有以下结构的 PostgreSQL 表:

在此处输入图片说明

我只需要将TYPEprove_identity_idfrom更改bigintbigserial。我阅读了文档,但无法理解如何在没有以下错误的情况下合法地实现更改:PostgreSQL said: type "bigserial" does not exist

PostgreSQL 10.1 on x86_64-apple-darwin14.5.0, compiled by Apple LLVM version 7.0.0 (clang-700.1.76), 64-bit

Erw*_*ter 15

bigserial是一种伪类型,一种在bigint内部解析为类型的符号方便- 加上一个序列、一个列默认值、一个依赖项和一个所有权。

bigint具有现有行的现有列转换为 a 的基本命令bigserial

CREATE SEQUENCE tbl_tbl_id_seq;
ALTER TABLE tbl ALTER COLUMN tbl_id SET DEFAULT nextval('tbl_tbl_id_seq');
ALTER SEQUENCE tbl_tbl_id_seq OWNED BY tbl.tbl_id;
SELECT setval('tbl_tbl_id_seq', COALESCE(max(tbl_id), 0)) FROM tbl;
Run Code Online (Sandbox Code Playgroud)

setval()获得SEQUENCE与当前最高ID同步。替换tbl为您的表名 ( prove_identity?)。

但是,您似乎已经有了合适的bigserial列。那么,这一切可能都是误会。

更多细节:

有关的:

在 Postgres 10 或更高版本中,考虑使用IDENTITY列作为替代方案:

  • @DaveChambers:一些客户端(比如 pgAdmin)显示伪类型 `serial`/`bigserial`,其他的(比如你的?你应该声明你的客户端)显示实际的数据类型。这纯粹是*代表*的问题。 (3认同)

Eva*_*oll 5

如果您使用 PostgreSQL 10,则应该IDENTITY PROPERTY在 bigint 列上使用 ,而根本不使用serialbigserial宏 - 这是 Pg 特定的语法,很难理解,并且在权限修改的情况下:很容易搞砸。

ALTER TABLE provide_identity
  ALTER COLUMN prove_identity_id
  ADD GENERATED BY DEFAULT
  AS IDENTITY;
Run Code Online (Sandbox Code Playgroud)

但我建议不要直接搞乱它,而是备份数据库并从第二象限博客运行此脚本。像这样运行,

SELECT upgrade_serial_to_identity('public.prove_identity', 'prove_identity_id');
Run Code Online (Sandbox Code Playgroud)