J'ai une table avec plus de millions de lignes. Je dois réinitialiser la séquence et réattribuer la colonne id avec de nouvelles valeurs (1, 2, 3, 4 ... etc ...). Y a-t-il un moyen facile de le faire?
postgresql
sequence
Sennin
la source
la source
id
il n'y a pas commencé à partir de 1. Donc, l'ordre s'est avéré comme suit: 150, 151 ..., 300, 1, 2 ... Et cela causerait éventuellement des erreurs d'identifiant en double, je suppose, si je n'avais pas renuméroté les identifiants. De plus, l'ordre parid
est généralement meilleur que l'ordre parcreated_at
. Et voici ce qui a fonctionné pour moi .Réponses:
Si vous ne souhaitez pas conserver l'ordre des identifiants, vous pouvez
Je doute qu'il y ait un moyen facile de le faire dans l'ordre de votre choix sans recréer la table entière.
la source
ALTER SEQUENCE seq RESTART WITH 1;
?SELECT setval('seq', 1, FALSE)
devrait faire la même chose (ici, le troisième argument, FALSE, fait la magie, car il montre que celanextval
doit être 1 au lieu de 2)Avec PostgreSQL 8.4 ou plus récent, il n'est plus nécessaire de spécifier le
WITH 1
. La valeur de départ qui a été enregistréeCREATE SEQUENCE
ou réglée en dernier parALTER SEQUENCE START WITH
sera utilisée (ce sera très probablement 1).Réinitialisez la séquence:
Ensuite, mettez à jour la colonne ID de la table:
Source: documentation PostgreSQL
la source
Réinitialisez la séquence:
Mise à jour des enregistrements actuels:
la source
serial
etCREATE SEQUENCE
est 1!)Les deux solutions fournies ne fonctionnaient pas pour moi;
setval('seq', 1)
commence la numérotation par 2, etALTER SEQUENCE seq START 1
commence également la numérotation par 2, car seq.is_called est vrai (Postgres version 9.0.4)La solution qui a fonctionné pour moi est:
la source
Juste pour simplifier et clarifier l'utilisation correcte de ALTER SEQUENCE et SELECT setval pour réinitialiser la séquence:
est équivalent à
L'une ou l'autre des instructions peut être utilisée pour réinitialiser la séquence et vous pouvez obtenir la valeur suivante par nextval ('sequence_name') comme indiqué ici également:
la source
La meilleure façon de réinitialiser une séquence pour recommencer avec le numéro 1 est d'exécuter ce qui suit:
Ainsi, par exemple pour la table des utilisateurs, ce serait:
la source
Pour conserver l'ordre des lignes:
la source
FYI: Si vous devez spécifier une nouvelle valeur de départ entre une plage d'ID (256 - 10000000 par exemple):
la source
La simple réinitialisation de la séquence et la mise à jour de toutes les lignes peuvent entraîner des erreurs d'ID en double. Dans de nombreux cas, vous devez mettre à jour toutes les lignes deux fois. D'abord avec des identifiants plus élevés pour éviter les doublons, puis avec les identifiants que vous voulez réellement.
Veuillez éviter d'ajouter un montant fixe à tous les identifiants (comme recommandé dans d'autres commentaires). Que se passe-t-il si vous avez plus de lignes que ce montant fixe? En supposant que la valeur suivante de la séquence est supérieure à tous les identifiants des lignes existantes (vous voulez simplement combler les lacunes), je le ferais comme:
la source
Dans mon cas, j'ai réalisé ceci avec:
Où ma table est nommée table
la source
Inspiré par les autres réponses ici, j'ai créé une fonction SQL pour effectuer une migration de séquence. La fonction déplace une séquence de touches primaires vers une nouvelle séquence contiguë commençant par n'importe quelle valeur (> = 1) à l'intérieur ou à l'extérieur de la plage de séquence existante.
J'explique ici comment j'ai utilisé cette fonction dans une migration de deux bases de données avec le même schéma mais des valeurs différentes dans une seule base de données.
Tout d'abord, la fonction (qui imprime les commandes SQL générées afin de savoir ce qui se passe réellement):
La fonction
migrate_pkey_sequence
prend les arguments suivants:arg_table
: nom de la table (par exemple'example'
)arg_column
: nom de la colonne de clé primaire (par exemple'id'
)arg_sequence
: nom de la séquence (par exemple'example_id_seq'
)arg_next_value
: valeur suivante de la colonne après la migrationIl effectue les opérations suivantes:
nextval('example_id_seq')
suitmax(id)
et que la séquence commence par 1. Cela gère également le cas oùarg_next_value > max(id)
.arg_next_value
. L'ordre des valeurs clés est conservé mais les trous dans la plage ne sont pas conservés.Pour démontrer, nous utilisons une séquence et un tableau définis comme suit (par exemple en utilisant
psql
):Ensuite, nous insérons quelques valeurs (commençant, par exemple, à 3):
Enfin, nous migrons les
example.id
valeurs pour commencer par 1.Le résultat:
la source
Même la colonne auto-incrémentée n'est pas PK (dans cet exemple, elle s'appelle seq - aka sequence), vous pouvez y parvenir avec un déclencheur:
DROP TABLE IF EXISTS devops_guide CASCADE;
la source
Si vous utilisez pgAdmin3, développez «Séquences», faites un clic droit sur une séquence, allez dans «Propriétés», et dans l'onglet «Définition» changez «Valeur actuelle» en la valeur que vous voulez. Il n'y a pas besoin de requête.
la source