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?
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');
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.
Si vous n'êtes pas en session, vous pouvez simplement nextval ('you_sequence_name') et c'est très bien.
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;
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.