使用循环将数据插入 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 上创建一个触发器,以便

  1. 当在 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。

  2. 当在 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 乔纳森