触发器,用于从同一表中的另一个属性填充属性



我想通过触发器从";nat_ cond";"的属性;depart_bt";表,同一表的3个其他属性的值";sect_ph"sect_n"metal_ cd";split_part(..,'_',..(函数的每个应用程序。

例如:如果";nat_cond":3*240+120mm2_AR2V_ALU

我应该得到:

"sect_ph":3*240+120mm2

"sect_n":AR2V

"metal_cd":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();

然而,除了添加的第一行什么也不做之外,触发器工作得很好。

我想我打了个圈。提前感谢您的帮助。

赋值中的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 = ...并不是真正必要的,因为您的触发器定义使触发器仅在更新或插入语句时触发。

最新更新