使用 PostgreSQL 上的触发器和函数,使用来自另一个 table 的信息更新 table 上的指定行
Updating a specified row on a table with information from another table using a trigger and function on PostgreSQL
我有一个 class 宠物店的数据库,其中包含 table Animals
每个动物的 ID 和最后一次咨询申请的日期,以及其他不相关的列和table Requisition
其中包含动物的 ID 和申请日期。
并且我需要创建一个触发器,每当在 table 上插入新申请(包含日期和 ID)时,该触发器将更新特定动物的最后一次咨询申请的日期。我还不是很擅长SQL,但这是我目前所拥有的:
ALTER TABLE animal
ADD lastRequestDate date;
CREATE OR REPLACE FUNCTION addRequestDate ()
RETURNS trigger as $$
BEGIN
UPDATE animal JOIN solicita ON idanimal
SET lastRequestDate -- here's where I got lost !!
END;
$$ language plpgsql;
CREATE TRIGGER updateLastRequest
AFTER INSERT ON request
FOR EACH ROW
EXECUTE PROCEDURE addRequestDate();
我为你重写函数。你能检查一下吗?
CREATE OR REPLACE FUNCTION addRequestDate RETURNS TRIGGER as
$BODY$
BEGIN
UPDATE
animal
SET lastRequestDate = now() -- This updates the last req date to todays date.
FROM solicita
WHERE animal.idanimal = solicita.idanimal
END;
$BODY$
language plpgsql;
基本上,只要有人在 solicica table 中添加新行,我们就必须用今天的日期更新动物 table。
只引用special row variable NEW
引用触发的插入行table:
CREATE OR REPLACE FUNCTION udpate_request_date()
RETURNS trigger
LANGUAGE plpgsql AS
$func$
BEGIN
UPDATE animal
SET last_request_date = now()
WHERE animal_id = NEW.animal_id;
END
$func$;
CREATE TRIGGER request_after_insert
AFTER INSERT ON request
FOR EACH ROW
EXECUTE FUNCTION udpate_request_date();
并使用正确、合法、小写的名称,让您的生活更轻松。参见:
- Are PostgreSQL column names case-sensitive?
我有一个 class 宠物店的数据库,其中包含 table Animals
每个动物的 ID 和最后一次咨询申请的日期,以及其他不相关的列和table Requisition
其中包含动物的 ID 和申请日期。
并且我需要创建一个触发器,每当在 table 上插入新申请(包含日期和 ID)时,该触发器将更新特定动物的最后一次咨询申请的日期。我还不是很擅长SQL,但这是我目前所拥有的:
ALTER TABLE animal
ADD lastRequestDate date;
CREATE OR REPLACE FUNCTION addRequestDate ()
RETURNS trigger as $$
BEGIN
UPDATE animal JOIN solicita ON idanimal
SET lastRequestDate -- here's where I got lost !!
END;
$$ language plpgsql;
CREATE TRIGGER updateLastRequest
AFTER INSERT ON request
FOR EACH ROW
EXECUTE PROCEDURE addRequestDate();
我为你重写函数。你能检查一下吗?
CREATE OR REPLACE FUNCTION addRequestDate RETURNS TRIGGER as
$BODY$
BEGIN
UPDATE
animal
SET lastRequestDate = now() -- This updates the last req date to todays date.
FROM solicita
WHERE animal.idanimal = solicita.idanimal
END;
$BODY$
language plpgsql;
基本上,只要有人在 solicica table 中添加新行,我们就必须用今天的日期更新动物 table。
只引用special row variable NEW
引用触发的插入行table:
CREATE OR REPLACE FUNCTION udpate_request_date()
RETURNS trigger
LANGUAGE plpgsql AS
$func$
BEGIN
UPDATE animal
SET last_request_date = now()
WHERE animal_id = NEW.animal_id;
END
$func$;
CREATE TRIGGER request_after_insert
AFTER INSERT ON request
FOR EACH ROW
EXECUTE FUNCTION udpate_request_date();
并使用正确、合法、小写的名称,让您的生活更轻松。参见:
- Are PostgreSQL column names case-sensitive?