如何在 PostgreSQL 11.1 中将现有列更改为身份

Posted

技术标签:

【中文标题】如何在 PostgreSQL 11.1 中将现有列更改为身份【英文标题】:How can i change existing column as Identity in PostgreSQL 11.1 【发布时间】:2019-04-07 04:11:21 【问题描述】:

我想将我现有的列更改为 Postgres 数据库中的 Auto Identity。 我尝试使用以下脚本,但它不起作用。 如果您有相同的解决方案,请告诉我 我不想使用 postgres 序列。我想使用 GENERATED ALWAYS AS IDENTITY

ALTER TABLE public.patient ALTER COLUMN patientid Type int4 
USING patientid::int4 GENERATED ALWAYS AS IDENTITY;

【问题讨论】:

【参考方案1】:

关注the documentation

ALTER TABLE patient 
    ALTER patientid SET NOT NULL,  -- optional
    ALTER patientid ADD GENERATED ALWAYS AS IDENTITY 
        (START WITH 2);  -- optional

如果列还没有约束,则添加NOT NULL 约束。可选子句START WITH start 更改记录的序列起始值。

在DB<>Fiddle.测试它

【讨论】:

对于所有 PostgreSQL v11 用户请注意,在将现有序列转换为标识列时存在一个错误(在 v12 中已修复),其中 PG 不会重新调整用途或删除现有序列,并为重复序列引发错误在随后的插入中。有关解决方法,请参阅 ***.com/a/55675778/840428。【参考方案2】:

假设您有一个表 patient 以前创建为

CREATE TABLE patient( patientid int, col1 int );

插入一行

INSERT INTO patient VALUES(1,5);

首先创建一个从 ID 的最大值开始迭代 +1 的序列,并为您的列设置为 default

CREATE SEQUENCE mySeq START WITH 2;
ALTER TABLE patient ALTER COLUMN patientid SET DEFAULT nextval('mySeq');

并将您的列转换为主键

ALTER TABLE patient ALTER COLUMN patientid SET NOT NULL;
ALTER TABLE patient ADD CONSTRAINT uk_patientid UNIQUE (patientid);

每当您插入新行时,例如

INSERT INTO patient(col1) VALUES(10);
INSERT INTO patient(col1) VALUES(15);

您会发现您已成功将您的列设为身份列

SELECT * FROM patient

patientid  col1
---------  ----
1          5
2          10
3          15

【讨论】:

我不想使用 postgres 序列。我想使用 ALWAYS AS IDENTITY。

以上是关于如何在 PostgreSQL 11.1 中将现有列更改为身份的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL 8.0.2 中将列表转换为数组

在 postgreSQL 中将 varchar 列更新为最新

如何在PostgreSQL中将空转换为null?

如何在 PostgreSQL / pgAdmin III 中将 bytea 数据打印为十六进制字符串?

在 PostgreSQL 中将数据类型“Varchar”更改为“TimeStamp”

如何在PostgreSQL / pgAdmin III中将bytea数据打印为十六进制字符串?