如何根据另一个 table 的结果触发或调用一个 table 的 INSERT 函数?
How do I trigger or call a function on INSERT to one table based on result of another table?
我知道如何使用 SQL 服务器或 Sybase 执行此操作,但似乎无法使用 Postgres 9.4 正确执行此操作。我有一个按预期工作的功能:
CREATE OR REPLACE FUNCTION "public"."welcome"(u_id INT DEFAULT 1234)
RETURNS "void"
AS $$
INSERT INTO my_table_1 (title,body,category,user_id,created_at)
VALUES ('Welcome!', '<some text>','general',u_id,now())
$$ LANGUAGE sql
此函数在调用 SELECT welcome(1234);
时按预期工作
但是,我想要做的是根据条件调用或触发此功能 AFTER
新用户被插入到另一个 table 并且该用户是第一个也是唯一的用户:
INSERT INTO my_table_2 (user_id,name,...) VALUES (5678,'John Doe',...);
并且满足以下条件:
SELECT COUNT(*) from my_table_2 WHERE <my conditions are met>;
returns 完全只有 1
因此,从语义上讲,我正在努力完成:
call TRIGGER welcome(1234) AFTER INSERT into my_table_2 where my conditions are met
我看过一些示例,但不太了解 CREATE FUNCTION x() AS TRIGGER
语法,Postgres 似乎在引导我朝这个方向发展,但我的案例中缺少示例。帮助! (提前致谢!)
在 SQL 标准中,您定义了一个 trigger
,它会在特定操作发生时触发 trigger function
。在您的情况下,您想创建一个 AFTER INSERT
触发器,其触发器函数调用您的 "welcome" 函数。
首先触发函数:
CREATE FUNCTION call_welcome() RETURNS trigger AS $$
DECLARE
cnt integer;
BEGIN
SELECT count(*) INTO cnt FROM my_table_2 WHERE ...;
IF cnt = 1 THEN
PERFORM welcome(NEW.user_id);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
触发器:
CREATE TRIGGER tr_call_welcome
AFTER INSERT ON my_table_2
FOR EACH ROW EXECUTE PROCEDURE call_welcome();
我知道如何使用 SQL 服务器或 Sybase 执行此操作,但似乎无法使用 Postgres 9.4 正确执行此操作。我有一个按预期工作的功能:
CREATE OR REPLACE FUNCTION "public"."welcome"(u_id INT DEFAULT 1234)
RETURNS "void"
AS $$
INSERT INTO my_table_1 (title,body,category,user_id,created_at)
VALUES ('Welcome!', '<some text>','general',u_id,now())
$$ LANGUAGE sql
此函数在调用 SELECT welcome(1234);
但是,我想要做的是根据条件调用或触发此功能 AFTER
新用户被插入到另一个 table 并且该用户是第一个也是唯一的用户:
INSERT INTO my_table_2 (user_id,name,...) VALUES (5678,'John Doe',...);
并且满足以下条件:
SELECT COUNT(*) from my_table_2 WHERE <my conditions are met>;
returns 完全只有 1
因此,从语义上讲,我正在努力完成:
call TRIGGER welcome(1234) AFTER INSERT into my_table_2 where my conditions are met
我看过一些示例,但不太了解 CREATE FUNCTION x() AS TRIGGER
语法,Postgres 似乎在引导我朝这个方向发展,但我的案例中缺少示例。帮助! (提前致谢!)
在 SQL 标准中,您定义了一个 trigger
,它会在特定操作发生时触发 trigger function
。在您的情况下,您想创建一个 AFTER INSERT
触发器,其触发器函数调用您的 "welcome" 函数。
首先触发函数:
CREATE FUNCTION call_welcome() RETURNS trigger AS $$
DECLARE
cnt integer;
BEGIN
SELECT count(*) INTO cnt FROM my_table_2 WHERE ...;
IF cnt = 1 THEN
PERFORM welcome(NEW.user_id);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
触发器:
CREATE TRIGGER tr_call_welcome
AFTER INSERT ON my_table_2
FOR EACH ROW EXECUTE PROCEDURE call_welcome();