使用 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?