gpt4 book ai didi

function - 在 postgresql 中创建触发器和函数

转载 作者:行者123 更新时间:2023-11-29 11:55:38 25 4
gpt4 key购买 nike

我如何在添加/更新之前创建一个触发函数函数应该检查具有相同id<的记录(即通过 id 与具有与 temporary_object 相同属性的现有 objects 进行比较)如果找到具有该 id 的记录,然后将该条目设置为time_dead,然后它添加一个条目,其中包含在该记录中找到的属性的相应值(为新记录设置的属性除外),当time_dead 为空则新时间的 time_create 等于当前时刻的那个时间。因此,新记录time_create 就像time_dead 的 祖先。如果找到具有该 ID 的记录,则将其添加到数据库中,并将其设置为当前时间的 time_create

例如这里是一个简单的解释(只是为了说明目的)

id time_create   time-dead  student  amount

1 06.12 07.12 henry 500

1 07.12 henry 1000

因此,如果一个名为 henry 且 ID 为 1 的学生在 06.12 进入一个房间并在 07.12 离开,他再次进入另一个房间时 time_dead 将等于 time_create(因此旧条目的 time_dead 和新条目的 time_create - 将相等)这些是我下面的 sql 格式的表

CREATE TABLE temporary_object
(
id integer NOT NULL,
time_create timestamp without time zone NOT NULL,
time_dead timestamp without time zone,
CONSTRAINT temporary_object_pkey PRIMARY KEY (id, time_create)
)

CREATE TABLE persons
(
fname text,
fsurname text,
)
INHERITS (temporary_object)


CREATE TABLE rooms
(
roomnum integer,
course integer,
passport text,
students_number text
)
INHERITS (temporary_object)

这是我正在尝试做的,但恐怕我不知道如何完成它,但我 100% 不正确,可能会有人帮忙

CREATE TRIGGER trigger2
BEFORE INSERT OR UPDATE
ON persons
FOR EACH ROW
EXECUTE PROCEDURE func1();

这是函数

 CREATE OR REPLACE FUNCTION func1() RETURNS TRIGGER AS $persons$
DECLARE
time_create integer;
time_dead timestamp;
id timestamp;
BEGIN

IF (TG_OP = 'INSERT') THEN

time_create=

最佳答案

我无法告诉您我从您的问题中遗漏了什么,但我会尝试回答我认为我理解的内容。

行级触发器可以访问受 NEWOLD 变量影响的行的版本(取决于 TG_OP)。在这种情况下,您可以使用 NEW:

CREATE OR REPLACE FUNCTION func1() 
RETURNS TRIGGER AS
$persons$
DECLARE
i integer;
BEGIN
IF TG_OP = 'INSERT'
THEN
UPDATE persons
SET time_dead = NEW.time_create
WHERE
id = NEW.id -- we are looking for the same ID
AND time_dead IS NULL
;
ELSE -- UPDATE
-- do here something
END IF;
END;
$persons$
LANGUAGE plpgsql;

这只是一个开始,根据您的需要进行修改。

关于function - 在 postgresql 中创建触发器和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13753320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com