使用循环将数据插入 table
insert data into table using loop
我以前从未在触发器中使用过循环,我有 3 个 tables,如下所示:
table 1
1_pk |user |tenant| filter
----------------------------------
| 1 | all | 1 | O
| 2 | john | 1 | AA
| 3 | peter | 1 | AB
| 4 | pat | 1 | AC
| 5 | all | 2 | O
| 6 | tony | 2 | AA
| 7 | jim | 2 | AB
table 2
2_pk |table1-FK|role | tenant
----------------------------------
| 1 | 1 | HR | 1
| 2 | 2 | staff | 1
| 3 | 2 | ceo | 1
| 4 | 5 | staff | 2
table 3
3_pk |table1-FK|table2-FK| tenant
----------------------------------
| 1 | 2 | 1 | 1
| 2 | 3 | 1 | 1
| 3 | 4 | 1 | 1
| 4 | 2 | 2 | 1
| 5 | 2 | 3 | 1
| 3 | 6 | 4 | 2
| 4 | 7 | 4 | 2
我想在 table 2 上创建一个触发器,以便
当在 table2 上创建记录且 table1_Fk 为 1 或 5(例如:请参阅 table 2)时,触发器必须将 3 条记录(如果 table1_Fk = 1)或 2 条记录(如果 table1_Fk = 5)插入 table 3。
换句话说,如果 filter column(table 1) = 'O' 那么触发器必须为该特定租户将 X 行插入 table 3。
当在 table2 上创建记录时 table1_Fk 为 2、3、4、6 或 7(例如:请参阅 table 2 ) 然后触发器必须只插入 1 条记录到 table 3.
我不知道每个租户在 table 1.[=14 中有多少条记录,所以我可以在此触发器中使用循环吗? =]
谢谢
你根本不需要循环。您可以使用基于集合的解决方案来完成。
CREATE OR REPLACE FUNCTION public.table2ins()
RETURNS trigger AS
$BODY$
declare filt character varying(2);
BEGIN
filt := (SELECT filter FROM table1 WHERE "1_pk" = NEW."table1-FK");
IF filt = 'O' THEN
INSERT INTO table3 ("table1-FK", "table2-FK", tenant)
SELECT table1."1_pk", NEW."2_pk", NEW.tenant FROM
table1 WHERE table1.tenant = NEW.tenant
AND table1.filter <> filt;
ELSE
INSERT INTO table3 ("table1-FK", "table2-FK", tenant)
SELECT table1."1_pk", NEW."2_pk", NEW.tenant FROM
table1 WHERE table1.tenant = NEW.tenant
AND table1.filter = filt;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
IE 如果过滤器是 'O',则添加其他条目,否则仅添加值本身。这种方法的优点是您不需要知道 'all' 记录的 id 值,您可以通过过滤器值找到它们(您也可以使用用户字段)。
顺便说一句,我假设 table3 中的主键是序列号。
HTH
乔纳森
我以前从未在触发器中使用过循环,我有 3 个 tables,如下所示:
table 1
1_pk |user |tenant| filter
----------------------------------
| 1 | all | 1 | O
| 2 | john | 1 | AA
| 3 | peter | 1 | AB
| 4 | pat | 1 | AC
| 5 | all | 2 | O
| 6 | tony | 2 | AA
| 7 | jim | 2 | AB
table 2
2_pk |table1-FK|role | tenant
----------------------------------
| 1 | 1 | HR | 1
| 2 | 2 | staff | 1
| 3 | 2 | ceo | 1
| 4 | 5 | staff | 2
table 3
3_pk |table1-FK|table2-FK| tenant
----------------------------------
| 1 | 2 | 1 | 1
| 2 | 3 | 1 | 1
| 3 | 4 | 1 | 1
| 4 | 2 | 2 | 1
| 5 | 2 | 3 | 1
| 3 | 6 | 4 | 2
| 4 | 7 | 4 | 2
我想在 table 2 上创建一个触发器,以便
当在 table2 上创建记录且 table1_Fk 为 1 或 5(例如:请参阅 table 2)时,触发器必须将 3 条记录(如果 table1_Fk = 1)或 2 条记录(如果 table1_Fk = 5)插入 table 3。 换句话说,如果 filter column(table 1) = 'O' 那么触发器必须为该特定租户将 X 行插入 table 3。
当在 table2 上创建记录时 table1_Fk 为 2、3、4、6 或 7(例如:请参阅 table 2 ) 然后触发器必须只插入 1 条记录到 table 3.
我不知道每个租户在 table 1.[=14 中有多少条记录,所以我可以在此触发器中使用循环吗? =]
谢谢
你根本不需要循环。您可以使用基于集合的解决方案来完成。
CREATE OR REPLACE FUNCTION public.table2ins()
RETURNS trigger AS
$BODY$
declare filt character varying(2);
BEGIN
filt := (SELECT filter FROM table1 WHERE "1_pk" = NEW."table1-FK");
IF filt = 'O' THEN
INSERT INTO table3 ("table1-FK", "table2-FK", tenant)
SELECT table1."1_pk", NEW."2_pk", NEW.tenant FROM
table1 WHERE table1.tenant = NEW.tenant
AND table1.filter <> filt;
ELSE
INSERT INTO table3 ("table1-FK", "table2-FK", tenant)
SELECT table1."1_pk", NEW."2_pk", NEW.tenant FROM
table1 WHERE table1.tenant = NEW.tenant
AND table1.filter = filt;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
IE 如果过滤器是 'O',则添加其他条目,否则仅添加值本身。这种方法的优点是您不需要知道 'all' 记录的 id 值,您可以通过过滤器值找到它们(您也可以使用用户字段)。
顺便说一句,我假设 table3 中的主键是序列号。
HTH 乔纳森