Comment append une clé primaire auto-incrémentée à une table existante, dans PostgreSQL?

J’ai un tableau avec des données existantes. Est-il possible d’append une clé primaire sans supprimer ni recréer la table?

 ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY; 

C’est tout ce dont vous avez besoin pour:

  1. Ajouter la colonne id
  2. Remplissez-le avec une séquence de 1 à compter (*).
  3. Définissez-le comme clé primaire / non null.

Le crédit est donné à @resnyanskiy qui a donné cette réponse dans un commentaire.

Pour utiliser une colonne d’identité dans la version 10,

 ALTER TABLE test ADD COLUMN id { int | bigint | smallint} GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY; 

Pour une explication des colonnes d’identité, voir https://blog.2ndquadrant.com/postgresql-10-identity-columns/ .

Pour la différence entre GÉNÉRÉ PAR DÉFAUT et GÉNÉRÉ TOUJOURS, voir https://www.cybertec-postgresql.com/fr/sequences-gains-and-pitfalls/ .

Pour modifier la séquence, voir https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/ .

J’ai atterri ici parce que je cherchais aussi quelque chose comme ça. Dans mon cas, je copiais les données d’un ensemble de tables de transfert contenant de nombreuses colonnes dans une table tout en atsortingbuant des identifiants de ligne à la table cible. Voici une variante des approches ci-dessus que j’ai utilisées. J’ai ajouté la colonne série à la fin de ma table cible. De cette façon, je n’ai pas besoin d’un espace réservé dans l’instruction Insert. Ensuite, une simple sélection * dans la table cible a automatiquement rempli cette colonne. Voici les deux instructions SQL que j’ai utilisées sur PostgreSQL 9.6.4.

 ALTER TABLE target ADD COLUMN some_column SERIAL; INSERT INTO target SELECT * from source;