Dav*_*ers 3 postgresql identity postgresql-10
我有一个具有以下结构的 PostgreSQL 表:
我只需要将TYPE
的prove_identity_id
from更改bigint
为bigserial
。我阅读了文档,但无法理解如何在没有以下错误的情况下合法地实现更改: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
列作为替代方案:
如果您使用 PostgreSQL 10,则应该IDENTITY PROPERTY
在 bigint 列上使用 ,而根本不使用serial
或bigserial
宏 - 这是 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)
归档时间: |
|
查看次数: |
12611 次 |
最近记录: |