如何在 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 / pgAdmin III 中将 bytea 数据打印为十六进制字符串?