Réinitialiser le compteur d'incrémentation automatique en postgres


232

Je voudrais forcer le champ d'incrémentation automatique d'une table à une certaine valeur, j'ai essayé avec ceci:

ALTER TABLE product AUTO_INCREMENT = 1453

ET

ALTER SEQUENCE product  RESTART WITH 1453;
ERROR:  relation "your_sequence_name" does not exist

Je suis nouveau dans les postgres :(

J'ai une table productavec Idet namechamp


5
Si nouveau pourquoi ne pas utiliser pgAdmin et inspecter les commandes qu'il va générer?
Unreason

1
Habituellement, les tableaux sont nommés comme des «produits» et non comme un «produit». Dans ce cas, votre séquence sera nommée comme «products_id_seq". Assurez-vous que vous recherchez une séquence correcte.
Alexander Gorg

Réponses:


309

Si vous avez créé la table productavec une idcolonne, la séquence n'est pas simplement appelée product, mais plutôt product_id_seq(c'est-à-dire ${table}_${column}_seq).

Voici la ALTER SEQUENCEcommande dont vous avez besoin:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

Vous pouvez voir les séquences dans votre base de données en utilisant la \dscommande dans psql. Si vous le faites \d productet regardez la contrainte par défaut pour votre colonne, l' nextval(...)appel spécifiera également le nom de la séquence.


66
Ce message ne précise pas quelle est la syntaxe correcte. C'est: ALTER SEQUENCE product_id_seq RESTART WITH 1453;
Liron Yahdav

7
Juste parce que j'ai mal analysé ce qui précède, voici ma façon de reformuler exactement la même chose. La syntaxe est ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #, où "seq" est le texte littéral, et vous entrez un nombre pour #. Ne négligez pas les soulignements. :-)
kmort

2
Veuillez noter que si vous n'utilisez pas le schéma public, il est nécessaire de préfixer avec my_schema. ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
Daniel L. VanDenBosch

Quelqu'un sait-il pourquoi ALTER SEQUENCE product_id_seq RESTART WITH (SELECT MAX (id) from product); Ça ne marche pas? La seule façon que j'ai trouvée est d'utiliser deux requêtes distinctes.
Chris Huang-Leaver

8
Notez que la valeur avec laquelle vous redémarrez est la prochaine valeur que vous souhaitez utiliser. Donc, si vous avez déjà un enregistrement avec id 1453, vous devriez RESTART WITH 1454.
Hugh

144

Voici la commande que vous recherchez, en supposant que votre séquence pour la table de produits est product_id_seq:

ALTER SEQUENCE product_id_seq REDÉMARRER AVEC 1453;


131

La commande suivante le fait automatiquement pour vous: cela supprimera également toutes les données du tableau. Donc sois prudent.

TRUNCATE TABLE someTable RESTART IDENTITY;

21
Attention - cela supprimera également toutes vos données
kibibu

28
@Loolooii, juste le signaler; si quelqu'un qui n'est pas familier avec SQL recherche ici parce qu'il a ajouté manuellement une ligne à une table avec un champ d'auto-incrémentation (via un ORM, par exemple), alors cette solution n'est probablement pas ce à quoi ils s'attendent.
kibibu

1
Le TABLEmot-clé est redondant. TRUNCATE someTable RESTART IDENTITY;est assez.
user1

Une idée de comment je ferais ça avec CASCADE?
ihossain

2
@ihossain avez-vous essayé TRUNCATE someTable RESTART IDENTITY CASCADE;?
Vedran

55

Pour régler le compteur de séquence:

setval('product_id_seq', 1453);

Si vous ne connaissez pas le nom de la séquence, utilisez la pg_get_serial_sequencefonction:

select pg_get_serial_sequence('product', 'id');
 pg_get_serial_sequence 
------------------------
 public.product_id_seq

Les paramètres sont le nom de la table et le nom de la colonne.

Ou émettez simplement un \d productà l' psqlinvite:

=> \d product
                         Table "public.product"
 Column |  Type   |                      Modifiers                       
--------+---------+------------------------------------------------------
 id     | integer | not null default nextval('product_id_seq'::regclass)
 name   | text    | 

14

- Changer la valeur de départ de la séquence

ALTER SEQUENCE project_id_seq RESTART 3000;

Idem mais dynamique:

SELECT SETVAL('project_id_seq', (SELECT MAX(id) + 1 FROM project));

Je suis d'accord que l'utilisation d'un SELECT est dérangeante mais ça marche.

Source: https://kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment


Si je ne me trompe pas, PG représente leurs séquences avec last_value et is_called, commence à (1, false), puis (1, true), (2, true) ... donc le MAX (id) + 1 devrait être MAX (id) pour ne pas ignorer un id.
Dix

J'ai également dû redémarrer mon instance postgres pour que cela fonctionne. brew services restart postgresql
BigRon

SELECT SETVAL ('project_id_seq', (SELECT MAX (id) + 1 FROM project)); Fonctionne parfaitement Mais existe-t-il un moyen de réinitialiser la valeur d'incrément à 0. Ainsi, les nouvelles entrées commencent par un index 0?
Charith Jayasanka,

13

Converti à partir d'un commentaire pour le confort du visiteur

Ce message ne précise pas quelle est la syntaxe correcte. C'est:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

6

si vous souhaitez réinitialiser l'incrémentation automatique à partir de l'interface graphique, suivez ces étapes.

  1. Accédez à votre base de données
  2. Cliquez sur Public
  3. dans la page Liste des tables, vous pouvez voir des TABS comme 'Tables', 'Vues', 'Séquences' comme ça.
  4. Cliquez sur les séquences
  5. lorsque vous cliquez sur «Séquences», vous pouvez voir toute la liste des séquences, cliquez sur celle que vous souhaitez réinitialiser
  6. Après cela, vous pouvez voir des choix multiples comme 'Alter', 'Set Value', 'Restart', 'Reset' etc ...
  7. puis cliquez sur Réinitialiser , puis ajoutez une nouvelle ligne.

6

Si vous avez une table avec une colonne IDENTITY pour laquelle vous souhaitez réinitialiser la valeur suivante, vous pouvez utiliser la commande suivante:

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;

1
Un + pour la convivialité en cas d'absence sequenceou vous ne pouvez pas tronquer la table. Je pense que c'est la meilleure réponse
ABS

5

Pour réinitialiser l'incrémentation automatique, vous devez obtenir le nom de votre séquence à l'aide de la requête suivante.

Syntaxe:

SELECT pg_get_serial_sequence(‘tablename’,  columnname‘);

Exemple:

SELECT pg_get_serial_sequence('demo', 'autoid');

La requête renverra le nom de séquence de l'autoid comme "Demo_autoid_seq" Ensuite, utilisez la requête suivante pour réinitialiser l'autoid

Syntaxe:

ALTER SEQUENCE sequenceName RESTART WITH value;

Exemple:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;

3

Pour obtenir l'ID de séquence, utilisez

SELECT pg_get_serial_sequence('tableName', 'ColumnName');

Cela vous donnera l'ID de séquençage en tant que tableName_ColumnName_seq

Pour obtenir le dernier numéro de graine, utilisez

select currval(pg_get_serial_sequence('tableName', 'ColumnName'));

ou si vous savez que l'ID de séquence l'utilise déjà directement.

select currval(tableName_ColumnName_seq);

Il vous donnera le dernier numéro de graine

Pour réinitialiser le numéro de graine, utilisez

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45

1

Utilisez cette requête pour vérifier quelle est la clé de séquence avec le schéma et la table,

SELECT pg_get_serial_sequence('"SchemaName"."TableName"', 'KeyColumnName'); // output: "SequenceKey"

Utilisez cette requête pour augmenter la valeur d'incrément un par un,

SELECT nextval('"SchemaName"."SequenceKey"'::regclass); // output 110

Lors de l'insertion dans le tableau, la prochaine valeur incrémentée sera utilisée comme clé (111).

Utilisez cette requête pour définir une valeur spécifique comme valeur incrémentée

SELECT setval('"SchemaName"."SequenceKey"', 120);

Lors de l'insertion dans le tableau, la prochaine valeur incrémentée sera utilisée comme clé (121).


0

Notez que si vous avez un nom de table avec '_', il est supprimé dans le nom de la séquence.

Par exemple, nom de table: user_tokens colonne: id Nom de séquence: usertokens_id_seq

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.