J'ai une table avec plus d'un million de lignes. Je dois réinitialiser la séquence et réaffecter la colonne id avec de nouvelles valeurs (1, 2, 3, 4... etc...). Existe-t-il un moyen simple de le faire ?
Cela ne devrait-il pas être ALTER SEQUENCE seq RESTART WITH 1;
?
8 votes
La vraie question : pourquoi diable voulez-vous faire cela ? On peut supposer que l'ID est la clé primaire, et qu'il n'y a donc aucun avantage à changer la clé primaire. Une clé primaire est une valeur sans signification (dans votre cas, une valeur artificielle). La "renuméroter" ne sert à rien dans une base de données relationnelle.
2 votes
Au départ, l'application fonctionnait localement, puis j'ai copié les données sur la production. Mais
id
ne commençaient pas à partir de 1. L'ordre s'est donc révélé être le suivant : 150, 151..., 300, 1, 2... Et cela causerait éventuellement des erreurs de duplication d'ids, je suppose, si je n'avais pas renuméroté les ids. De plus, l'ordre parid
est généralement meilleure que la commande parcreated_at
. Et voici ce qui a marché pour moi .0 votes
Le but est de pouvoir continuer à utiliser un entier normal au lieu d'un bigint pour une clé primaire dans une base de données qui continue à incrémenter la clé séquentielle mais qui reçoit constamment de nouvelles données. Vous atteindrez rapidement la limite des entiers signés, et si la conservation de l'identifiant existant n'est pas importante, ce processus vous ramènera à des nombres d'identifiants gérables.
1 votes
Une autre utilisation de cette fonction est le test. Vous voulez réinitialiser une table à un état connu avant de commencer chaque test et cela nécessite que les identifiants soient réinitialisés.