PostgreSQL中的触发器不接受默认值



我有一个表"xxx",列"req"。在"req"这一列上,我希望它总是采用以以下方式自动生成的值。列"req"值为Ref_0001后,再插入Ref_0002、Ref_0003 .... ...我尝试了第一种解决方案,感谢@Craig Ringer

CREATE SEQUENCE seq_ref;
CREATE TABLE dossier
        (
        ref TEXT NOT NULL PRIMARY KEY DEFAULT 'ref' || NEXTVAL('seq_ref'),
        value TEXT
        );

如果你想要零填充的数字,使用这个:

CREATE SEQUENCE seq_ref;
CREATE TABLE dossier
        (
        ref TEXT NOT NULL PRIMARY KEY DEFAULT 'ref' || LPAD(NEXTVAL('seq_ref')::TEXT, 10, '0'),
        value TEXT
        );

这个解决方案它不工作与我的应用程序在插入新行。但与pgAdmin当我尝试插入,列是空的,直到我刷新表。所以我试着用扳机。

我最终在PostgreSQL中创建了一个触发器来解决我的问题。为列req生成值此表格Ref00001, Ref0002…但它并没有改变;它不起作用;仍然是空列:

CREATE table test(
id serial primary key,
non varchar(12),
req varchar(12)
  );
CREATE OR REPLACE FUNCTION Start_generate() RETURNS trigger AS $emp_stamp$
    BEGIN
      NEW.req := ('ref'::text || lpad((nextval('seq_refcomposant'::regclass))::text, 6, '0'::text));
        return null;
    END;
$emp_stamp$ LANGUAGE plpgsql;
CREATE TRIGGER Generate_ref AFTER INSERT ON test
    FOR EACH ROW EXECUTE PROCEDURE Start_generate();

我不知道为什么它不工作…添加默认值到

NEW.req := DEFAULT  ('ref'::text || lpad((nextval('seq_refcomposant'::regclass))::text, 6, '0'::text));

默认有错误!

我怎样才能达到我想要的效果?

您需要使用before触发器,并返回行:

CREATE OR REPLACE FUNCTION Start_generate() RETURNS trigger AS $emp_stamp$
    BEGIN
      NEW.req := ('ref'::text || lpad((nextval('seq_refcomposant'::regclass))::text, 6, '0'::text));
        return NEW;
    END;
$emp_stamp$ LANGUAGE plpgsql;
CREATE TRIGGER Generate_ref BEFORE INSERT ON test
    FOR EACH ROW
WHEN (NEW.req IS NULL)
EXECUTE PROCEDURE Start_generate();

最新更新