在基于其他列的列中插入一个数字 OLD INSERTs

INSERT a number in a column based on other columns OLD INSERTs

在 Postgre 中SQL 我有这个 table...(最左边有一个主键 "timestamp02",这张图中没有显示,请不要'不要打扰,对于这个问题的目的并不重要)

在上面的 table 中,所有列都是通过查询输入的,但 "time_index" 除外,我想在每次填充每一行时通过触发器自动填充它。

这是创建相同 table(没有任何值)的代码,因此每个人都可以使用 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" 列的插入值在 "time_index" 列中插入一个数字。

如果 ("fn_name" 和 "time_type") 进行的组合(例如检查邮件 - 开始)在之前(上文)的任何行中都不存在,则在 "time_index"列,

Elif both ("fn_name" and "time_type") 做一个确实存在于之前(上面)的某行中的组合,然后在 [=51] 中插入前面(上面)后面的数字=]列。

(请查看示例 table 图片,此触发器将生成其上的每个红色高亮方块)

我看了很多,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();

然后当我在 table 中手动插入值时,没有任何变化(没有错误消息)time_index 列仍然是空的,我做错了什么???

请一些好的PostgreSQL程序员帮我一把,我真的在这个任务中走到了死胡同,我还有什么想法。

提前致谢

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

将触发器创建为 BEFORE INSERT