|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : avril 2007 Messages : 19 ![]() |
bonjour,
j'ai une table avec un id SERIAL, sur un INSERT INTO (ajouter enregistrement) je ne specifie pas le champs de l'id je laisse le serveur s'en charger, ce qui se fait correctement avec le type SERIAL. problème : je voudrais après un tel INSERT recuperer l'id que le serveur vient d'attribué en sachant que les autres champs n'ont pas de contrainte UNIQUE et donc peuvent contenir des doublons. merci pour vos suggestions ! |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
un type serial crée automatiquement une séquence sur la colonne, tu peux récupérer le curval de ta séquence (plus pratique que de faire un max(colonne) sur ta table)
|
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : avril 2007 Messages : 19 ![]() |
et si jamais il y a une autre insertion à partir d'une autre machine sur le meme reseau avant que je ne recupere curval ... je ne recupere pas l'id de mon insertion mais celui d'une autre ?
|
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
c'est tout le problème du type serial quand il y a des insertions concurrentes
le plus prudent c'est que, à chaque insertion, tu commences par récupérer le résultat de ta_sequence.nextval dans une variable, et c'est ce résultat que tu insères dans ta table via une 2ème requête ça évite le pb que tu décris |
|
|
00
|
|
|
#5 | |
|
Expert Confirmé Sénior
![]() ![]() Inscription : mai 2004 Messages : 4 490 ![]() |
Citation:
Pour plus d'information, voir l'article de Damien : http://dgriessinger.developpez.com/p...sql/sequences/
__________________
FAQ XML ------------ « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser » Giacomo Leopardi |
|
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : avril 2007 Messages : 19 ![]() |
ok ... il est bon le truc des sequences, ça resout pas mal de problèmes !
merci pour votre temps et suggestions ! |
|
|
00
|
|
|
#7 | |
|
Membre éclairé
![]() Inscription : janvier 2006 Messages : 332 ![]() |
Citation:
Une solution serait de poser un verrou sur la table avant l'insertion et de le relacher aprés avoir récupérer la valeur de la séquence. Ainsi, la valeur de la sequence sera obligatoirement celle de la derniére insertion. Puisqu'il était impossible d'inserer d'autre ligne entre temps grace au verrou. |
|
|
|
00
|
|
|
#8 | |
|
Invité de passage
![]() Inscription : avril 2007 Messages : 19 ![]() |
Citation:
|
|
|
|
00
|
|
|
#9 | |
|
Membre éclairé
![]() Inscription : janvier 2006 Messages : 332 ![]() |
Désolé, je me suis trompé.
En lisant trop vite ce thread, j'ai ne pas pris connaissance du fait suivant : ![]() Citation:
Tu peux donc faire tes inserts tranquillement. |
|
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Inscription : avril 2007 Messages : 19 ![]() |
ok ! merci à tous !
|
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
C'est tout l'intérêt du nextval : tu récupères une bonne fois pour toutes une valeur unique qui ne sera plus jamais utilisée, donc si côté développement c'est possible de faire en 2 étapes (d'abord récupérer le nextval et ensuite insérer), c'est plus propre que de poser temporairement un verrou sur ta table
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com