【问题标题】:insert data into table using loop使用循环将数据插入表中
【发布时间】:2016-08-08 09:09:28
【问题描述】:

我之前从未在触发器中使用过循环,我有如下 3 个表:

表 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

表 2

  2_pk  |table1-FK|role  | tenant
 ----------------------------------
|   1   |   1    |  HR   | 1
|   2   |   2    | staff | 1
|   3   |   2    |  ceo  | 1
|   4   |   5    | staff | 2

表 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

我想在表 2 上创建一个触发器,以便

  1. 当在 table2 上创建记录时 table1_Fk 为 1 或 5(例如:请参阅表 2),那么触发器必须插入 3 条记录(如果 table1_Fk = 1)或 2 条记录(如果 table1_Fk = 5 ) 记入表 3。 换句话说,如果 filter column(table 1) = 'O' 那么触发器必须为该特定租户将 X 行插入到表 3 中。

  2. 如果在 table2 上创建了一条记录,其中 table1_Fk 为 2、3、4、6 或 7(例如:请参阅表 2),则触发器只需将 1 条记录插入到表 3 中。

有没有办法可以在此触发器中使用循环,因为我不知道每个租户在 表 1 中有多少条记录。

谢谢

【问题讨论】:

  • 我不知道您的系统何时将多少数据插入表 3。您能否让您的示例更具体并显示应插入哪些值?
  • @Philipp- 在表 2 和表 3 中添加了更多数据,希望它能解释。谢谢。

标签: postgresql postgresql-9.1


【解决方案1】:

您根本不需要循环。您可以使用基于集合的解决方案来做到这一点。

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”,则添加其他条目,否则仅添加值本身。这种方法的优点是您不需要知道“所有”记录的 id 值,您可以通过过滤器值找到它们(您也可以使用用户字段)。

顺便说一句,我假设 table3 中的主键是序列号。

HTH 乔纳森

【讨论】:

  • 谢谢乔纳森:它正在工作。我没有办法期望这个解决方案。非常感谢。
猜你喜欢
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
相关资源
最近更新 更多