Avec le select max(id) + 1
approche, deux sessions insérées simultanément verront le même ID max actuel de la table, et les deux inséreront la même nouvelle valeur d'ID. La seule façon de l'utiliser en toute sécurité est de verrouiller la table avant de démarrer la transaction, ce qui est pénible et sérialise les transactions. (Et comme le souligne Stijn, les valeurs peuvent être réutilisées si l'enregistrement le plus élevé est supprimé). Fondamentalement, n'utilisez jamais cette approche. (Il peut y avoir très occasionnellement une raison impérieuse de le faire, mais je ne suis pas sûr d'en avoir déjà vu une).
La séquence garantit que les deux sessions obtiendront des valeurs différentes et qu'aucune sérialisation n'est nécessaire. Il fonctionnera mieux et sera plus sûr, plus facile à coder et plus facile à entretenir.
La seule façon d'obtenir des erreurs en double à l'aide de la séquence est si des enregistrements existent déjà dans la table avec des ID au-dessus de la valeur de séquence, ou si quelque chose insère encore des enregistrements sans utiliser la séquence. Donc, si vous aviez une table existante avec des ID saisis manuellement, disons de 1 à 10, et que vous avez créé une séquence avec une valeur de départ par défaut de 1, la première insertion utilisant la séquence essaierait d'insérer un ID de 1 - qui existe déjà . Après avoir essayé 10 fois, la séquence vous donnerait 11, ce qui fonctionnerait. Si vous utilisiez ensuite l'approche max-ID pour faire la prochaine insertion qui utiliserait 12, mais la séquence serait toujours sur 11 et vous donnerait également 12 la prochaine fois que vous appelleriez nextval
.
La séquence et le tableau ne sont pas liés. La séquence n'est pas automatiquement mise à jour si une valeur d'ID générée manuellement est insérée dans la table, de sorte que les deux approches ne se mélangent pas. (Entre autres choses, la même séquence peut être utilisée pour générer des identifiants pour plusieurs tables, comme mentionné dans la documentation).
Si vous passez d'une approche manuelle à une approche séquentielle, vous devez vous assurer que la séquence est créée avec une valeur commençant par supérieure à tous les ID existants dans la table, et que tout ce qui fait une insertion utilise la séquence seulement dans le futur.