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

时间:2013-05-06 13:38:42

标签: 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));

并且默认有错误!

如何达到我想要的效果?

1 个答案:

答案 0 :(得分:1)

您需要使用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();