PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgres aggiornerebbe davvero il file di pagina quando i campi sono tutti uguali prima e dopo l'aggiornamento?

Postgres (come quasi tutti gli altri DBMS) non verificherà se i valori target sono diversi da quelli originali. Quindi la risposta è:sì, aggiornerà la riga anche se i valori sono diversi.

Tuttavia, puoi facilmente impedire l'aggiornamento "vuoto" in questo caso includendo una clausola where:

INSERT INTO topic (......) 
VALUES (......)
ON CONFLICT (...) 
DO UPDATE 
    set ... -- update all column
WHERE topic IS DISTINCT FROM excluded;

La clausola where impedirà l'aggiornamento di una riga identica a quella che viene inserita. Per farlo funzionare correttamente, il tuo inserto ha per elencare tutti colonne delle tabelle di destinazione. Altrimenti l'topic is distinct from excluded la condizione sarà sempre vera perché excluded la riga ha meno colonne rispetto all'topic riga e quindi è "distinto" da esso.

L'aggiunta di un controllo per i valori modificati è stata discussa più volte nella mailing list ed è sempre stata eliminata. Il motivo principale è che non ha senso avere il sovraccarico di controllare le modifiche per ogni dichiarazione solo per far fronte ad alcune scritte male.