PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

postgres mettrait-il vraiment à jour le fichier de page lorsque les champs sont tous égaux avant et après la mise à jour ?

Postgres (comme presque tous les autres SGBD) ne vérifiera pas si les valeurs cibles sont différentes de celles d'origine. La réponse est donc :oui, la ligne sera mise à jour même si les valeurs sont différentes.

Cependant, vous pouvez facilement empêcher la mise à jour "vide" dans ce cas en incluant une clause where :

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

La clause where empêchera la mise à jour d'une ligne identique à celle qui est insérée. Pour que cela fonctionne correctement, votre insert a pour lister tous colonnes des tables cibles. Sinon, le topic is distinct from excluded condition sera toujours vraie car le excluded la ligne a moins de colonnes que le topic ligne et donc elle s'identifie "distincte" de celle-ci.

L'ajout d'une vérification des valeurs modifiées a été discuté à plusieurs reprises sur la liste de diffusion et a toujours été rejeté. La raison principale étant qu'il n'est pas logique d'avoir la charge de vérifier les modifications pour chaque déclaration juste pour faire face à quelques-unes mal écrites.