【问题标题】:Trigger to populate attributes from another attribute in the same table触发以从同一个表中的另一个属性填充属性
【发布时间】:2022-11-04 15:12:24
【问题描述】:

我想通过触发器自动填充“depart_bt”表的“nat_cond”属性值,同一表“sect_ph”、“sect_n”、“metal_cond”的3个其他属性的值每个split_part( ..,'_',..) 功能。

例如 : 如果“nat_cond”的值:3*240+120mm2_AR2V_ALU

我应该得到:

“sect_ph”:3*240+120mm2

“sect_n”:AR2V

“metal_cond”:ALU

我的代码如下:

CREATE OR REPLACE FUNCTION nat_cond_auto() RETURNS TRIGGER 
language plpgsql AS 
$$
BEGIN
    IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN
        NEW.sect_ph:= (SELECT split_part(NEW.nat_cond::TEXT, '_', 1) LIMIT 1);
        NEW.sect_n:= (SELECT split_part(NEW.nat_cond::TEXT, '_', 2) FROM depart_bt LIMIT 1);
        NEW.metal_cond:= (SELECT split_part(NEW.nat_cond::TEXT, '_', 3) FROM depart_bt LIMIT 1);
    END IF;
    RETURN NEW;
END; 
$$
;

-- table depart_bt
DROP TRIGGER IF EXISTS nat_conducteur ON depart_bt;
CREATE TRIGGER nat_conducteur BEFORE INSERT OR UPDATE ON depart_bt
FOR EACH ROW EXECUTE PROCEDURE nat_cond_auto();

但是,触发器工作得很好,除了第一个添加的行什么都不做。

我想我循环了一些东西。 预先感谢您的帮助。

【问题讨论】:

  • 我觉得很难相信。
  • 离开_bt 是一个空间表,我使用 QGIS 添加实体
  • 这没有什么区别。我不相信你。请提供一个独立的、完整的复制器。

标签: postgresql triggers


【解决方案1】:

您在分配中的 SELECT 语句完全没有用,因为您不使用来自可能返回的行中的任何数据。但是这些选择也是您的触发器不起作用的原因:如果表为空select ... from depart_bt limit 1 将不会返回任何内容。

我想你只是想要:

CREATE OR REPLACE FUNCTION nat_cond_auto() RETURNS TRIGGER 
language plpgsql AS 
$$
BEGIN
    IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN
        NEW.sect_ph := split_part(NEW.nat_cond::TEXT, '_', 1);
        NEW.sect_n := split_part(NEW.nat_cond::TEXT, '_', 2);
        NEW.metal_cond := split_part(NEW.nat_cond::TEXT, '_', 3);
    END IF;
    RETURN NEW;
END; 
$$
;

请注意,IF TG_OP = ... 并不是真正需要的,因为您的触发器定义使触发器仅在更新或插入语句时触发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2015-07-12
    • 1970-01-01
    • 2015-11-19
    • 2019-05-05
    • 2014-09-25
    相关资源
    最近更新 更多