title: Postgresql - trigger adds twice
body: <p>I have many triggers in my tables, but one behaves not exactly like I want it.</p>
  
  <p>This one counts products and price and returns total price for order - works ok:</p>
  
  <pre><code>CREATE OR REPLACE FUNCTION ustawwartosczamowienia() RETURNS TRIGGER AS $$
  
  DECLARE
  
  przed NUMERIC;
  po NUMERIC;
  ile NUMERIC;
  
  
  BEGIN
  IF (TG_OP = 'INSERT') OR (TG_OP = 'UPDATE') THEN
  
  SELECT cena*zamowienieilosc INTO ile FROM zamowienie_zawiera INNER JOIN zamowienie on zamowienie.id=zamowienie_idzamowienie inner join egzemplarz on zamowienie_zawiera.egzemplarz_idegzemplarz=egzemplarz.id inner join produkt on egzemplarz.produkt_idprodukt = produkt.id WHERE zamowienieilosc = new.zamowienieilosc;
  
  SELECT wartosczamowienia INTO przed FROM zamowienie WHERE zamowienie.id = new.zamowienie_idzamowienie;
  
  
  po := przed+ile;
  UPDATE zamowienie SET wartosczamowienia=po WHERE zamowienie.id = new.zamowienie_idzamowienie;
  
  ELSE
  RAISE NOTICE 'Nie ma czegoś takiego';
  
  END IF;
  
  RETURN NEW;
  
  END
  $$
  LANGUAGE 'plpgsql';
  
  
  CREATE TRIGGER zamowieniewartosc
  AFTER INSERT OR UPDATE
  ON zamowienie_zawiera
  FOR EACH ROW
  EXECUTE PROCEDURE ustawwartosczamowienia();
  </code></pre>
  
  <p>And then I see that somebody purchased goods for f.e. 1024 totally. So I want add this money to this one's personal account to give them special offers for loyal customers later. I wrote similar trigger:</p>
  
  <pre><code>CREATE OR REPLACE FUNCTION kontododaj() RETURNS TRIGGER AS $$
  
  DECLARE
  
  przed NUMERIC;
  po NUMERIC;
  ile NUMERIC;
  
  klient_idklient RECORD;
  
  
  BEGIN
  IF (TG_OP = 'INSERT') OR (TG_OP = 'UPDATE') THEN
  
  SELECT sumazamowien INTO przed FROM klient WHERE klient.id = new.klient_idklient; 
  
  SELECT wartosczamowienia INTO ile FROM zamowienie WHERE wartosczamowienia =  new.wartosczamowienia; 
  
  po := przed + ile;
  
  UPDATE klient SET sumazamowien=po WHERE klient.id = new.klient_idklient;
  
  ELSE
  RAISE NOTICE 'Nie ma czegoś takiego';
  
  END IF;
  RETURN NEW;
  
  END
  $$
  LANGUAGE 'plpgsql';
  
  
  CREATE TRIGGER kontoplus
  AFTER INSERT OR UPDATE
  ON zamowienie
  FOR EACH ROW
  EXECUTE PROCEDURE kontododaj();
  </code></pre>
  
  <p>Then I look at somebody's account and they have 2048 instead 1024. My trigger adds money twice. What should I change?</p>