Postgresql SERIAL fonctionne-t-il différemment?
J'ai une postgres table avec une SÉRIE d'id de l'.
id (serial) name age
Insertion se produit généralement à partir d'une application web.
J'ai inséré manuellement deux nouveaux records du réglage de l'id de max (id)+1****
Après ces 2 insérer lorsque la web app insère 2 enregistrement il donne erreur de clé en double.
Juste pour 2 enregistrements. Après que tout fonctionne bien.
La question est Pourquoi n'ai pas mon manuel insérer incrémenter le numéro de série?
Sont auto increment et de série sont différents?
Ce qui me manque ici? N'MySQL ou tout autre SQL ont le même problème?
source d'informationauteur zod | 2013-08-22
Vous devez vous connecter pour publier un commentaire.
Lorsque vous créez un
série
oubigserial
colonne, PostgreSQL en fait de trois choses:int
oubigint
colonne.nextval()
.Lorsque vous INSÉREZ une valeur sans en préciser le
serial
colonne (ou si vous spécifiez explicitementDEFAULT
de sa valeur),nextval
sera appelée sur la séquence:Si vous avez manuellement approvisionnement en non-valeur par défaut pour le
serial
colonne puis la séquence ne sera pas mis à jour etnextval
peut renvoyer des valeurs que votreserial
colonne utilise déjà. Donc, si vous faites ce genre de chose, vous devez corriger manuellement la séquence en appelantnextval
ousetval
.Aussi garder à l'esprit que les dossiers peuvent être supprimés afin que les lacunes dans
serial
colonnes sont tellement à l'aide demax(id) + 1
n'est pas une bonne idée, même si il n'y avait pas de problèmes de concurrence d'accès.Si vous utilisez
serial
oubigserial
votre meilleur pari est de laisser PostgreSQL prendre en charge l'attribution des valeurs pour vous et prétendre qu'ils sont opaques numéros qui vient de se produire dans un certain ordre: ne pas attribuer vous-même et ne présumez pas quelque chose à leur sujet autre que l'unicité. Cette règle générale s'applique à l'ensemble de la base de données de l'OMI.Je ne suis pas certain combien de MySQL
auto_increment
fonctionne avec tous les différents types de base de données, mais peut-être l'amende manuel aidera.Si vous souhaitez insérer un enregistrement dans la table avec
serial
de la colonne juste omettre de la requête, il sera automatiquement généré.Ou vous pouvez insérer son défaut valeur avec quelque chose comme:
Troisième option est de malually prendre les valeurs à partir de série de série directement:
Cette approche est totalement faux et ne fonctionne pas dans tout base de données. C'est seulement travaillé pour vous à ce jour dans MySQL par pure chance.
Si deux connexions simultanément de l'exécuter, ils recevront le même ID. Il ne peut fonctionner de manière fiable si vous verrouillez la table contre simultanées lit de sorte qu'une seule connexion peut être l'obtention d'un IDENTIFIANT à un moment.
C'est aussi terriblement inefficace.
C'est pourquoi les séquences d'exister, de sorte que vous pouvez obtenir de manière fiable Id dans la présence concomitante d'introduire.
Suffit d'utiliser:
ou:
DEFAULT
est un endroit spécial porte-dire que la base de données pour obtenir la valeur par défaut pour la colonne à partir de la définition de la table. La valeur par défaut estnextval('my_table_id_seq')
de sorte que la prochaine valeur de la séquence aurez inséré.Puisque vous êtes à poser des questions de base concernant les séquences, je vous recommande également d'envisager que séquences ne sont pas instantanés. Il est normal pour les séquences d'avoir des "trous", où les valeurs de la table de go 1, 3, 4, 5, 9, 10, ... .