pg_affected_rows != mysql_affected_rows !?

test=# create table affected_test (id serial, data text);
NOTICE:  CREATE TABLE will create implicit sequence "affected_test_id_seq" for serial column "affected_test.id"
CREATE TABLE
test=# insert into affected_test (data) values ('irgendein Inhalt');
INSERT 0 1
test=# update affected_test set data='neuer Inhalt' where id=2;
UPDATE 0
test=# update affected_test set data='neuer Inhalt' where id=1;
UPDATE 1

Ich weiß, was du sagen möchtest, aber: die Aussage der PostgreSQL Funktion ist richtig. Die Zeilen werden tatsächlich aktualisiert - unabhängig davon was dort vorher stand.


Gut, du willst das also umgehen: du musst vorher prüfen ob sich die Daten ändern. Das wird erstens etwas umfangreicher und zweitens kostet das Performance:

CREATE TABLE affected_test (id serial, data text);

INSERT INTO affected_test (data) VALUES ('irgendein Inhalt');


CREATE OR REPLACE FUNCTION update_test ()
          RETURNS TRIGGER
AS $$
DECLARE

BEGIN

  IF TG_OP = 'UPDATE' THEN
      IF NEW.id = OLD.id AND NEW.data = OLD.data THEN
          -- keine Datenaenderung
          RETURN NULL;
      END IF;
      RETURN NEW;
  END IF;

  IF TG_OP = 'INSERT' THEN
      RETURN NEW;
  END IF;

  IF TG_OP = 'DELETE' THEN
      RETURN OLD;
  END IF;


  -- wird nicht erreicht
  RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';


CREATE TRIGGER update_test_trigger BEFORE INSERT OR UPDATE OR DELETE ON affected_test FOR EACH ROW
               EXECUTE PROCEDURE update_test();

Gut, ausprobieren:

test=# update affected_test set data='neuer Inhalt' where id=1;
UPDATE 1
test=# update affected_test set data='neuer Inhalt' where id=1;
UPDATE 0

Passt.