PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 15/11/2019 17:38:45

ramirez22
Membre

[PG9.6] Comment gérer au mieux les contraintes d'unicité ?

Bonjour,


Je me pose une question bête.
J'ai créé une table avec des contraintes d'unicité sur plusieurs colonnes.
Lors de l'INSERT d'une nouvelle ligne, qu'est-ce qui est plus "propre"?


1- Faire l'INSERT et traiter le message de défaut qui arrivera en cas de doublon
2- Faire une vérification avant de faire l'insert (SELECT ...)


La deuxième option me semble plus "normale" : on ne s'appuie pas sur un garde fou système et on gère nous même l'unicité, quitte à avoir un défaut si un INSERT est réalisé par un autre utilisateur entre le SELECT et l'INSERT.


Mais du coup, dans mon application, j'ai 2 contrôles plus ou moins identiques :
- je fais d'abord un SELECT pour vérifier si tout est OK et je traite l'erreur le cas échéant
- je fais mon INSERT
- en cas d'erreur sur la contrainte d'unicité, je traite l'erreur de la même manière


Sans compter que la deuxième solution génère le double de trafic...
[Edit]Cependant, je viens de constater que l'incrémentation automatique de mon ID se faisait même en cas de présence de doublon (dans le cas de figure 1 ci-dessus). Ce qui risque de générer quelque "trous" dans mes ID...


Est-ce que c'est selon la sensibilité de chacun ou est-ce qu'il y a des règles particulières ?


Merci de votre attention.
Cordialement,
Ramirez22.

Dernière modification par ramirez22 (15/11/2019 17:58:57)

Hors ligne

#2 15/11/2019 17:56:48

Marc Cousin
Membre

Re : [PG9.6] Comment gérer au mieux les contraintes d'unicité ?

Avec PostgreSQL récent, le mieux est d'utiliser INSERT ON CONFLICT (regardez la doc d'INSERT), dans la mesure du possible. Sinon oui, c'est mieux de ne pas générer d'erreur (ne serait-ce que pour ne pas polluer la log)


Marc.

Hors ligne

#3 15/11/2019 17:58:42

rjuju
Administrateur

Re : [PG9.6] Comment gérer au mieux les contraintes d'unicité ?

Effectivement, inutile de faire une premiière vérification.  Vous pouvez toujours utiliser la clause ON CONFLICT pour limiter les erreurs.

Hors ligne

#4 15/11/2019 18:01:30

ramirez22
Membre

Re : [PG9.6] Comment gérer au mieux les contraintes d'unicité ?

Beaucoup de réponse en peu de temps, merci et bravo.
Du coup, mon [edit] ci-dessus risque de passer inaperçu.


je viens de voir qu'en plus, avec la 1ère méthode (utiliser l'erreur de la contrainte) incrémentait néanmoins le compteur de ma clef primaire.


Je vais creuser le ON CONFLICT.


Merci beaucoup.
Cordialement,
Ramirez22

Hors ligne

#5 15/11/2019 22:20:55

rjuju
Administrateur

Re : [PG9.6] Comment gérer au mieux les contraintes d'unicité ?

Tout à fait vous pourrez vous retrouver avec des numéro manquants, et c'est parce qu'il est nécessaire d'obtenir une valeur depuis la séquence avant de tenter une insertion, qui pourra finir en erreur.  Avoir des numéros manquants ne devrait pas être un problème, sinon c'est que vous avez besoin d'une donnée type "numéro de facture", et là effectivement une séquence n'est vraiment pas ce qu'il vous faut (en plus de toutes les autres règles liées aux factures).

Hors ligne

Pied de page des forums