我正在尝试在 PostgreSQL 中创建一个触发器函数,该函数应该在插入或更新记录之前检查相同的记录id
(即id
与现有记录进行比较)。如果函数找到具有相同 的记录id
,则该条目设置为time_dead
。让我用这个例子来解释:
INSERT INTO persons (id, time_create, time_dead, name)
VALUES (1, 'now();', ' ', 'james');
我想要一张这样的桌子:
id time_create time-dead name
1 06:12 henry
2 07:12 muka
id 1
有一个time_create 06.12
但是time_dead
是NULL
。这是相同的,id 2
但下次我尝试insert
使用相同的 id 但不同的名称运行查询时,我应该得到一个像这样的表:
id time_create time-dead name
1 06:12 14:35 henry
2 07:12 muka
1 14:35 waks
henry 和 waks 共享 相同 的id
1
. 运行insert
查询后 henry's time_dead
is equal to waks' time_create
。如果要使用 id 1 创建另一个条目,假设为 james,则 james 的时间条目将等于time_dead
for waks。等等。
到目前为止,我的功能看起来像这样。但它不起作用:
CREATE FUNCTION tr_function() RETURNS trigger AS '
BEGIN
IF tg_op = ''UPDATE'' THEN
UPDATE persons
SET time_dead = NEW.time_create
Where
id = NEW.id
AND time_dead IS NULL
;
END IF;
RETURN new;
END
' LANGUAGE plpgsql;
CREATE TRIGGER sofgr BEFORE INSERT OR UPDATE
ON persons FOR each ROW
EXECUTE PROCEDURE tr_function();
当我运行它时,它的说法time_dead
不应该是null
. 有没有一种方法可以编写一个trigger function
自动输入时间inserting or updating
但在我运行查询时给我上表的结果select
?
我究竟做错了什么?
我的两张桌子:
CREATE TABLE temporary_object
(
id integer NOT NULL,
time_create timestamp without time zone NOT NULL,
time_dead timestamp without time zone,
PRIMARY KEY (id, time_create)
);
CREATE TABLE persons
(
name text
)
INHERITS (temporary_object);