如何创建触发器以在postgresql中插入一系列数字;但是在之前验证了insert语句..?

时间:2016-05-30 15:55:01

标签: postgresql

大家早上好,我对以下案例有疑问:

我有一个触发器和一个插入土地代码的函数,但是当它插入一行时效果很好。 但是当一个insert语句无法对表达式中的任何问题执行时,sequence函数会在插入行之前生成一个值,从而丢失编号中的顺序。

有一种方法可以在触发器或函数中进行更改,以便在移动到序列函数之前在INSERT表达式之前验证我,从而避免这些数字的跳转。

代码(triger和function)以及表格的图像。

CODE:

CREATE TRIGGER trigger_codigo_pech
BEFORE INSERT ON independizacion
FOR EACH ROW
EXECUTE PROCEDURE codigo_pech();
CREATE OR REPLACE FUNCTION codigo_pech()
RETURNS trigger
AS $$

DECLARE
incremento INTEGER;
cod_inde text;

BEGIN
IF (NEW.cod_inde IS NULL OR NEW.cod_inde = '''' ) THEN
incremento = nextval ('codigo_pech');
NEW.cod_inde = 'PECH' || '-' || incremento;
END IF;
RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';

CAPTURE QUERY RESULT

正如您所看到的,还需要在主键上触发以防止数字跳跃。

我希望你的帮助。谢谢

1 个答案:

答案 0 :(得分:0)

你可以使incremento.cod_inde可以推迟并且最初是:

ALTER TABLE incremento ALTER COLUMN cod_inde SET DEFAULT 0;
ALTER TABLE incremento
  ALTER CONSTRAINT incremento_cod_inde_key 
    DEFERRABLE INITIALLY DEFERRED;

然后在AFTER INSERT触发器中分配nextval('codigo_pech')

CREATE OR REPLACE FUNCTION codigo_pech_after() RETURNS trigger AS $$
BEGIN
  UPDATE incremento SET
    cod_inde = 'PECH-' || (nextval('codigo_pech'))::text
  WHERE id = NEW.id; -- replace id with your table's primary key
END;
$$ LANGUAGE plpgsql;