根据其他列OLD INSERT在列中插入一个数字

时间:2015-06-19 16:22:51

标签: postgresql triggers autofill

在PostgreSQL中我有这个表...(最左侧有一个主键“timestamp02”,这张图片中没有显示,请不要打扰,这对于这个问题并不重要)

enter image description here

在上表中,所有列都是通过查询输入的,除了“time_index”,我希望每次填充每行时都会自动填充这些列。

这是创建相同表(没有任何值)的代码,因此每个人都可以使用Postgre SQL查询面板创建它。

CREATE TABLE table_ebscb_spa_log02
(
  pcnum smallint,
  timestamp02 timestamp with time zone NOT NULL DEFAULT now(),
  fn_name character varying,
  "time" time without time zone,
  time_elapse character varying,
  time_type character varying,
  time_index real,
  CONSTRAINT table_ebscb_spa_log02_pkey PRIMARY KEY (timestamp02)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE table_ebscb_spa_log02
  OWNER TO postgres;

我想要触发的是:

根据每行中“fn_name”和“time_type”列的INSERTed值,在“time_index”列中插入一个数字。

如果两者(“fn_name”和“time_type”)组合(例如,检查邮件 - 开始)在上面(上面)之前的任何行中都不存在,那么在“time_index”列中插入1,

Elif(“fn_name”和“time_type”)执行在(上面)之前的某行中确实存在的组合,然后在“time_index”列中插入前一个(上面)之后的数字。

(请查看示例表图像,此触发器将在其上生成每个红色突出显示的正方形)

我看了许多PostgreSQL教程视频,阅读了很多手册,包括这些

http://www.postgresql.org/docs/9.4/static/sql-createtrigger.html http://www.postgresql.org/docs/9.4/static/plpgsql-trigger.html

没有任何结果。

到目前为止,我已经尝试过创建函数:

CREATE OR REPLACE FUNCTION on_ai_myTable() RETURNS TRIGGER AS $$
DECLARE
t_ix real;
n int;

BEGIN
IF NEW.time_type = 'Start' THEN
    SELECT t.time_index FROM table_ebscb_spa_log02 t WHERE t.fn_name = NEW.fn_name AND t.time_type = 'Start' ORDER BY t.timestamp02 DESC LIMIT 1 INTO t_ix;
      GET DIAGNOSTICS n = ROW_COUNT;
        IF (n = 0) THEN 
        t_ix = 1;
        ELSE 
        t_ix = t_ix + 1;
        END IF;
END IF;
NEW.time_index = t_ix;
return NEW;
END
$$
LANGUAGE plpgsql;

这就是创建查询:

CREATE TRIGGER on_ai_myTable
    AFTER INSERT ON table_ebscb_spa_log02
    FOR EACH ROW
    EXECUTE PROCEDURE on_ai_myTable();

然后当我手动在表中插入值时,没有任何更改(没有错误消息)time_index列只是保持为空,我做错了什么???

请一些优秀的PostgreSQL同事程序员可以帮我一把,我真的已经在这个任务中走到了死点,我还有更多的想法。

提前致谢

1 个答案:

答案 0 :(得分:0)

AFTER INSERT触发器中,您对NEW.time_index所做的任何更改都将被忽略。此时已插入记录;修改它为时已晚。

创建触发器BEFORE INSERT