2016-09-26 40 views
0

我的一些数据模型有一些关系,必须在对其子进行更改时保持更新,例如多点位置,这些位置是许多必须更新点位置的子项的集合如果一个孩子搬迁。这种关系有很多种,我想要在一个触发器+程序中处理这些关系的完整性,在更新父母受影响关系的相关字段时触发以下过程。如何在plpgsql过程中有条件地运行查询

我如何格式化这些查询和条件,使得它完成以下操作:

CREATE TABLE parents (
    id BIGSERIAL PRIMARY KEY, 
    caption TEXT, 
    title TEXT, 
    tags CHARACTER VARYING(32)[] DEFAULT '{}', 
    rating SMALLINT DEFAULT 0 
) 
CREATE TABLE children (
    id BIGSERIAL PRIMARY KEY, 
    tags CHARACTER VARYING(32)[] DEFAULT '{}', 
    rating SMALLINT DEFAULT 0 
) 
CREATE TABLE parent_children (
    parent_id BIGINT, 
    child_id BIGINT 
) 

CREATE OR REPLACE FUNCTION child_updated_func() RETURNS TRIGGER AS $$ 
    BEGIN 
     IF (OLD.tags != NEW.tags) 
      UPDATE parents 
      SET tags = tags || NEW.tags 
      WHERE 
       parent_children.child_id = NEW.id 
       AND parents.id = parent_children.parent_id; 
     IF (OLD.rating != NEW.rating) 
      UPDATE parents 
      SET rating = MAX(parent_children.rating) 
      FROM parent_children 
      WHERE 
       parent_children.child_id = NEW.id 
       AND parents.id = parent_children.parent_id; 
     RETURN NEW; 
    END 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER child_updated 
    AFTER UPDATE ON children 
    FOR EACH ROW 
    EXECUTE PROCEDURE child_updated_func(); 
+0

请[编辑]你的问题添加了'创建表“有关表格的陈述。 [_Formatted_](http://stackoverflow.com/editing-help#code)**文本**,请[无屏幕截图](http://meta.stackoverflow.com/questions/285551/why-may-i -not-upload-images-code-on-so-when-asking-question-285557#285557) –

回答

1

你可能想是这样的:

CREATE OR REPLACE FUNCTION func() RETURNS TRIGGER AS $$ 
    BEGIN 
     IF (OLD.tags != NEW.tags) THEN 
      UPDATE parents 
      SET tags = tags || NEW.tags 
      WHERE 
       parent_children.child_id = NEW.id 
       AND parents.id = parent_children.parent_id; 
     END IF; 
     IF (OLD.rating != NEW.rating) 
      UPDATE parents 
      SET rating = MAX(parent_children.rating) 
      FROM parent_children 
      WHERE 
       parent_children.child_id = NEW.id 
       AND parents.id = parent_children.parent_id; 
     END IF; 
     RETURN NEW; 
    END 
$$ LANGUAGE plpgsql; 
+0

这正是我想要的,谢谢!那些查询是按顺序执行的,对吗? – terpak

+1

@terpak是的。 – redneb

+0

也只是一个头,以防万一你想更新你的答案,我删除了伪代码,赞成在那里有所有的sql信息,根据a_horse_with_no_name的请求。再次感谢! – terpak

相关问题