Postgres:如何将默认值设置为max(value)+1



如何将默认值设置为字段+1的最大值。

我试过了:

,no_af          integer UNIQUE NOT NULL DEFAULT max(no_af)+1

但得到了答案:

"错误:错误:自动操作les表达式par défaut";

我很高兴它没有起作用。请不要那样做。请使用序列:

,no_af serial UNIQUE NOT NULL

如果您的设计在值序列中不需要孔,请将该设计替换为允许孔的设计。

我找到了一种使用触发器的方法:

CREATE FUNCTION no_af_incrementation() RETURNS trigger AS $no_af_incrementation$
begin
if NEW.no_af is NULL then
NEW.no_af := (select max(no_af)+1 from af.od_af);
end if;
return NEW;
end;

创建一个FUNCTION并在DEFAULT定义中使用它。

CREATE OR REPLACE FUNCTION "public"."table_next_id"("table" text)
RETURNS "pg_catalog"."int4" AS $BODY$
DECLARE
next_id int4 = 0;
BEGIN
EXECUTE format('select max(id)+1 from %s', "table") INTO next_id;       
RETURN COALESCE(next_id, 1);
END$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
CREATE TABLE "public"."merchant" (
"id" int4 NOT NULL DEFAULT table_next_id('merchant'::text),
"num" int4 NOT NULL,
CONSTRAINT "merchant_pkey" PRIMARY KEY ("id")
);

我不知道是否存在潜在的问题,尤其是在并发插入中。但它确实有效。

pg版本15.1

最新更新