web-dev-qa-db-fra.com

PostgreSQL prochaine valeur des séquences?

J'utilise PostgreSQL pour mon site web Codeigniter. J'utilise crud d'épicerie pour les opérations d'ajout, de modification et de suppression. Lors de la modification ou de l'ajout, je souhaite renommer un fichier téléchargé de manière dynamique en fonction de l'identifiant du contenu. Je suis capable de faire cela en utilisant la fonction callback_after_upload de l'épicerie crud. 

Je veux un prochain identifiant du contenu tout en ajoutant un nouveau contenu. J'ai essayé d'utiliser la fonction nextval(), mais la séquence est incrémentée avec elle. Comment obtenir la dernière valeur de la séquence sans utiliser la fonction nextval()?

Ou y a-t-il un moyen simple de faire cela?

27
i_nomad

La valeur précédemment obtenue d'une séquence est accessible avec la fonction currval()

Mais cela ne retournera une valeur que si nextval() a été appelé avant que. 

Il n'y a absolument aucun moyen de "jeter un coup d'oeil" à la valeur suivante d'une séquence sans l'obtenir réellement. 

Mais votre question n'est pas claire. Si vous appelez nextval() avant de procéder à l'insertion, vous pouvez utiliser cette valeur dans l'insertion. Ou mieux encore, utilisez currval() dans votre déclaration d'insertion:

select nextval('my_sequence') ...

... do some stuff with the obtained value

insert into my_table(id, filename)
values (currval('my_sequence'), 'some_valid_filename');
15

Même si cela peut être fait, c'est une idée terrible car il serait possible d'obtenir une séquence qui serait ensuite utilisée par un autre disque!

Une meilleure idée est de sauvegarder l’enregistrement puis de récupérer la séquence par la suite.

0
Brian

Si vous n'êtes pas en session, vous pouvez simplement nextval ('you_sequence_name') et c'est très bien.

0
Irlan Cidade

J'ai essayé ça et ça marche parfaitement 

@Entity
public class Shipwreck {
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
  @Basic(optional = false)
  @SequenceGenerator(name = "seq", sequenceName = "shipwreck_seq", allocationSize = 1)
  Long id;

....

CREATE SEQUENCE public.shipwreck_seq
    INCREMENT 1
    START 110
    MINVALUE 1
    MAXVALUE 9223372036854775807
    CACHE 1;
0
user2699843

Pour répondre littéralement à votre question, voici comment obtenir la valeur suivante d'une séquence sans l'incrémenter:

SELECT
 CASE WHEN is_called THEN
   last_value + 1
 ELSE
   last_value
 END
FROM sequence_name

Évidemment, ce n’est pas une bonne idée d’utiliser ce code dans la pratique. Il n'y a aucune garantie que la prochaine rangée aura vraiment cet ID. Cependant, pour le débogage, il peut être intéressant de connaître la valeur d'une séquence sans l'incrémenter, et voici comment procéder.

0
Jakob Egger