PostgreSQL valeur suivante de la séquence?
Je suis à l'utilisation de PostgreSQL pour mon Codeigniter site web. Je suis à l'aide d'épicerie crud pour ajouter, modifier et supprimer des opérations. Tout en faisant une modification ou d'ajout, je veux renommer un fichier téléchargé de manière dynamique en fonction de l'id du contenu. Je suis en mesure de le faire à l'aide d'épicerie crud de callback_after_upload
fonction.
Je veux un à côté de l'id du contenu lors de l'ajout d'un nouveau contenu. J'ai essayé d'utiliser nextval()
la fonction, mais la séquence est incrémenté avec elle. Comment pouvez obtenir la dernière valeur de la séquence sans l'aide de nextval()
fonction?
Ou est-il un simple moyen pour que je puisse faire cela?
- En fait, c'est obsolète et inutilement inefficace, trop. Vous pouvez faire cela avec un aller-retour vers le serveur. J'ai ajouté une réponse.
- Il est toujours utile de mentionner que, et mu de démonstration d'un autre
nextval
appel qui est utilisée dans une instruction insert, parce que contrairement àINSERT ... RETURNING
les deux fonctionneront via la génération de requêtes de moteurs et d'autres choses douloureuses qui peuvent ne pas comprendre laRETURNING
extension :S - Merci pour cette info.
- Si votre générateur de requêtes ne comprend pas la
RETURNING
clause (qui a été autour depuis des années maintenant!), c'est peut-être obsolète ou juste une mauvaise béquille qui est à la recherche pour le remplacement. Encore, il est bon d'avoir la solution de repli a_horse fourni. Aucun argument là.
Vous devez vous connecter pour publier un commentaire.
RETURNING
Moderne-jour de PostgreSQL (8.2 ou plus tard) vous faites cela avec un seul voyage aller-retour à la base de données:
tbl_id
être unsérie
colonne. De plus dans le manuel.Explicitement récupère la valeur
Si
filename
doit incluretbl_id
(redondance), vous pouvez toujours utiliser une seule requête.Utilisation
lastval()
ou plus spécifiquescurrval()
:Le manuel à propos de
lastval()
:Si vous avez (ou peut avoir) plusieurs séquences liées à la table (même par des déclencheurs ou d'autres effets secondaires) le sûr façon est d'utiliser des
currval('tbl_tbl_id_seq')
.Nom de la séquence
La littéral de chaîne
'tbl_tbl_id_seq'
dans mon exemple est censé être le réelle nom de la séquence et est moulé pourregclass
, qui lève une exception si aucune séquence de ce nom peut être trouvé dans le courant desearch_path
.tbl_tbl_id_seq
est généré automatiquement par défaut pour une tabletbl
avec une série de colonnestbl_id
. Mais il n'y a pas de garanties. Une colonne par défaut permet de récupérer les valeurs de tout de la séquence si ainsi définies. Et si le nom par défaut est prise lors de la création de la table, Postgres choisit le prochain nom gratuit selon codé en dur algorithme.Si vous n'avez pas savoir le nom de la séquence pour une
serial
colonne, le chercher avec la fonction dédiéepg_get_serial_sequence()
. Peut même être fait à la volée:SQL Violon.
filename
, vous pouvez le faire, aussi. Ajouté un peu de ma réponse.Précédemment obtenu la valeur d'une séquence est accessible avec les
currval()
fonction.Mais qui ne fera que renvoyer une valeur si
nextval()
a été appelé avant que.Il n'y a absolument aucun moyen de "tricher" lors de la prochaine valeur d'une séquence sans l'obtenir.
Mais votre question n'est pas claire. Si vous appelez
nextval()
avant de procéder à l'insertion, vous pouvez utiliser cette valeur dans l'insert. Ou mieux encore, utilisercurrval()
dans votre instruction insert:Même si cela peut en quelque sorte être fait c'est une idée terrible, puisqu'il serait possible d'obtenir une séquence qui obtient ensuite utilisé par un autre record!
Une bien meilleure idée est de l'enregistrer et ensuite récupérer la séquence par la suite.
Si vous n'êtes pas dans une session, vous pouvez simplement nextval('you_sequence_name") et c'est très bien.
Pour répondre à votre question, littéralement, voici comment obtenir la valeur suivante d'une séquence sans incrémentation:
Évidemment, il n'est pas une bonne idée d'utiliser ce code dans la pratique. Il n'y a aucune garantie que la prochaine ligne sera vraiment avoir cette identité. Toutefois, à des fins de débogage, il pourrait être intéressant de connaître la valeur d'une séquence sans incrémenter, et c'est comment vous pouvez le faire.
Je l'ai essayé et il fonctionne parfaitement
....