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

hwazgwia  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(3)|浏览(189)

我想在Postgres数据库中将现有列更改为自动标识。
我不想使用Postgres SEQUENCE。我想用GENERATED ALWAYS AS IDENTITY
我试过下面的脚本,但它没有工作。

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

我该怎么办?

qncylg1j

qncylg1j1#

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.中测试

55ooxyrt

55ooxyrt2#

假设您有一个表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
2uluyalo

2uluyalo3#

可以使用动态SQL替换序列的初始值。

do $$
declare
id_max int4;
begin
select max(patientid)+1 into id_max from patient;
execute 'alter table patient alter patientid set not null,
                             alter patientid add generated by always as identity  (start with '||id_max||' )';
end;
$$;

Test it in db<>fiddle

相关问题