在PostgreSQL中我有这个表...(最左侧有一个主键“timestamp02”,这张图片中没有显示,请不要打扰,这对于这个问题并不重要)
在上表中,所有列都是通过查询输入的,除了“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同事程序员可以帮我一把,我真的已经在这个任务中走到了死点,我还有更多的想法。提前致谢
答案 0 :(得分:0)
在AFTER INSERT
触发器中,您对NEW.time_index
所做的任何更改都将被忽略。此时已插入记录;修改它为时已晚。
创建触发器BEFORE INSERT
。