web-dev-qa-db-fra.com

Postgres: comment insérer une ligne avec un ID d'auto-incrémentation

Il y a un "contexte" de table. Il existe un identifiant d'auto-incrémentation "context_id". J'utilise la séquence pour récupérer la valeur suivante.

SELECT nextval('context_context_id_seq')

Le résultat est de: 1, 2, 3, ... 20 ....

Mais il y a 24780 lignes dans la table "contextuelle"

Comment puis-je obtenir la prochaine valeur (24781)?

Je dois l'utiliser dans l'instruction INSERT

7
user3631472

Apparemment, vous avez inséré des lignes dans cette table sans en utilisant la séquence et c'est pourquoi elles ne sont pas synchronisées.

Vous devez définir la valeur correcte pour la séquence à l'aide de setval()

select setval('context_context_id_seq', (select max(context_id) from context));

Ensuite, le prochain appel à nextval() devrait renvoyer la valeur correcte.

Si la colonne est en effet définie comme serial (il n'y a pas "d'incrémentation automatique" dans Postgres) alors vous devriez laisser Postgres faire son travail et ne jamais le mentionner lors des insers:

insert into context (some_column, some_other_column)
values (42, 'foobar');

s'assurera que la valeur par défaut de la colonne context_id est appliquée. Vous pouvez également utiliser:

insert into context (context_id, some_column, some_other_column)
values (default, 42, 'foobar');
20
INSERT INTO public.tablename (id, operator, text) values((SELECT MAX(id)+1 FROM public.tablename), 'OPERATOR',''); 
0
user186221