在基于其他列的列中插入一个数字 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
。
在 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
。