【发布时间】:2018-12-31 22:15:33
【问题描述】:
我正在使用 PostgreSQL 10.3 中的下表:
CREATE TABLE s_etpta.tab1 (
Number VARCHAR(40) NOT NULL,
id VARCHAR(8),
CONSTRAINT i_tab1 PRIMARY KEY(Number)
)
我需要在每次插入时将列 id 增加 1。我不能更改表,因为我不是所有者,所以我别无选择,只能增加 varchar 列。
该列的类型为varchar,前缀为0。如果表为空,如何指定要以“00000001”开头?因为当我的表中已经有值时,触发器会获取最后一个值并为下一个正确的插入增加它,但是当我的表为空时,id 列保持为空,因为触发器没有要增加的值。
CREATE OR REPLACE FUNCTION schema."Num" (
)
RETURNS trigger AS
$body$
DECLARE
BEGIN
NEW.id := lpad(CAST(CAST(max (id) AS INTEGER)+1 as varchar),8, '0') from
schema.tab1;
return NEW;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
COST 100;
【问题讨论】:
-
使用
COALESCE,但实际上您应该使用序列,因为这对于并发事务是不安全的。 -
请记住始终公开您的 Postgres 版本。
-
不幸的是,我不能更改这些表,因为我不是所有者,所以除了增加一个 varchar 列之外我别无选择。我希望在我的应用中插入时更新该列。
-
我尝试使用序列 (New.id:=nextval('MySequence')) (但我的序列出现错误“关系不存在”。我正在使用 Sql Manager PostgreSQL 5.9.3
-
您的客户端(Sql Manager)的版本与此几乎无关。您的 Postgres 版本很重要:
SELECT version();
标签: postgresql triggers auto-increment