
Envoyé par
agemis31
Rien. En te paraphrasant on peut tout faire si on le veut.,
Oui, il suffit d'expliquer comment 

Envoyé par
agemis31
Je dirais plutot que parfois faisabilité à tout prix rime avec prise de tête.
Oui je suis plutôt d'accord avec toi... mais là en l'occurence pas trop si on veut faire ça vite fait. C'est surtout qu'ici ça rime avec "mauvaise habitude"

Envoyé par
agemis31
j'ai déja eu affaire à quelques "responsables" qui voulaient éviter à tout prix les trous dans les séquences, la plupart du temps pour des raisons purement idéologiques.
Effectivement, la plupart du temps ces raisons ne sont pas ou mal fondées. L'idéal est de convaincre le 'dit' responsable qu'avoir une clé IDENTITY c'est mieux. S'il veut absolument avoir un numéro de séquence unique et sans trou de séquence alors ce que je préconiserai c'est une des deux solutions suivantes :
1 - Créer cet identifiant sur une autre colonne (que l'on affichera comme identifiant) et garder une clé unique IDENTITY avec une contrainte d'unicité
2 - La plus compliquée... faire une table ne contenant qu'une colonne de type IDENTITY et la remplir avec 10 000 000 d'enregistrements (par exemple) puis faire la requête suivante qui te renvoie le premier identifiant non utilisé :
SELECT MIN(id) FROM id WHERE NOT EXISTS (SELECT id_user FROM user WHERE id_user = id)
Je ne suis pas très fan de cette solution mais au moins elle marche à 100%, mieux que le MAX+1... qui peut laisser des trous si l'insertion est faite dans une transaction avec d'autres requêtes, qu'une requête situé après le MAX+1 plante et qu' au même moment un programme appelle aussi cette transaction...
Donc effectivement le MAX+1 peut ne pas fonctionner à 100%... mais ça laisse un faible probabilité tout ce même, il faut voir le contexte pour prendre la bonne décision. Le MAX+1 restant une solution très légère par rapport à la proposition 2
Partager