2017-12-24 13 views
1

두 테이블이 있습니다. 표 x와 표 y. 표 x는 매일 업데이트됩니다. Table x에 새로운 데이터가 삽입되면 바로 테이블 y를 업데이트하고 싶습니다. 표 y에는 매일 표 x의 모든 업데이트에 대한 집계 값이 포함됩니다. 날짜는 날짜 유형이고 나머지 두 열은 실제 유형입니다. Table_x는 매일 업데이트 될 수 있으며 table_y는 자동으로 업데이트되어야합니다.Postgres 트리거 함수는 다른 테이블에서 집계 된 결과를 업데이트합니다.

x : 아래와 같이

Date Sales product 
12/12/2017 14000 7 
11/12/2017 3000 7 

는 I 트리거 함수를 작성하지만, 집계 값보다는 각 항목을 갱신한다 :

Date Sales product 
12/12/2017 4000 2 
12/12/2017 3000 1 
12/12/2017 2000 1 
12/12/2017 5000 3 
11/12/2017 1000 3 
11/12/2017 2000 4 

y는 (아래와 같이 업데이트하기) .

CREATE OR REPLACE FUNCTION public.rec_insert_table_y() 
RETURNS trigger AS 
$BODY$ 
BEGIN 
INSERT INTO table_y ("Date","Sales","product") 
SELECT NEW."Date",(sum(NEW."Sales")),(sum(NEW."product")) 
GROUP BY NEW."Date"; 
RETURN NEW; 

트리거 기능 :

CREATE TRIGGER insert_into_table_y 
AFTER INSERT 
ON public.table_x 
FOR EACH ROW 
EXECUTE PROCEDURE public.rec_insert_table_y(); 
+1

에서 실행 예제를 볼 수 있습니다 버전 어디서나. 그리고 당신의 기능도 불완전합니다. 또한 누락 : 기본 정보 : 새로운 제품을 테이블'x'에 삽입 할 수 있습니까? 또는 기존 제품의 새로운 행만? 정보를 완성하려면 [편집]하십시오. –

+0

@Erwin : 제안한대로 정의를 업데이트하십시오. 내 Postgres 버전은 "PostgreSQL 9.5.3"입니다. 예, 신제품이 Table_x에 매일 삽입됩니다. – MoChen

+0

내 의견의이 부분은 답이 없습니다 :'새로운 제품을 표 x에 삽입 할 수 있습니까? 또는 기존 제품의 새로운 행만? ' –

답변

0

당신은 그렇지 않으면 존재하거나 삽입하는 경우 집계 값을 업데이트하는 트리거를 작성할 수 있습니다.

은 또한 당신은 알고 업데이트해야하며 'X'표에서 삭제해야합니다

create function y_x_trg() returns trigger 
    language plpgsql 
as 
$body$ 
declare 
    row_exists boolean; 
begin 
    if tg_op<>'INSERT' then 
    update y 
     set sales = y.sales - old.sales, 
      product = y.product - old.product 
     where y.date = old.date 
     returning true into row_exists; 
    end if; 
    if tg_op<>'DELETE' then 
    update y 
     set sales = y.sales + new.sales, 
      product = y.product + new.product 
     where y.date = new.date 
     returning true into row_exists; 
    if row_exists is not true then 
     insert into y values (new.date, new.sales, new.product); 
    end if; 
    return new; 
    else 
    return null; 
    end if; 
end; 
$body$; 

create trigger y_x_trg AFTER INSERT OR UPDATE OR DELETE ON x 
    FOR EACH ROW EXECUTE PROCEDURE y_x_trg(); 

당신은 내가 당신의 트리거 정의 나 테이블 정의도 포스트 그레스를 볼 수 http://rextester.com/FVR79644

+0

Emilio는 업데이트에 감사하지만 목표 테이블로 매일 판매 및 제품을 합산 (합산)합니까? . GROUP BY 메서드를 사용하여 날짜 열을 어떻게 사용해야하는지 생각했습니다. 틀렸다고 정정하십시오. – MoChen

+0

작성 중입니다. 나는 오해한다. 나는 이드가 제품을 풀어 준다. 당신의 본보기가 분명합니다, 그것은 내 잘못이었습니다. 나는 'y'테이블이 PK로만 날짜를 가지고 있다는 것을 반영하기 위해 해답을 편집했다. –