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.