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

J'ai une table avec des données existantes. Existe-t-il un moyen d'ajouter une clé primaire sans supprimer et recréer la table?

122
demandé sur Chris W. 2010-05-31 19:31:57

4 réponses

(mise à Jour - Merci aux gens qui ont commenté)

Versions modernes de PostgreSQL

Supposons que vous avez une table nommée test1, auquel vous souhaitez ajouter une incrémentation automatique, clé primaire id (porteuse) de la colonne. La commande suivante devrait être suffisante dans les versions récentes de PostgreSQL:

   ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

Anciennes Versions de PostgreSQL

Dans les anciennes versions de PostgreSQL (avant 8.x?) vous avez dû faire tout le sale boulot. La séquence de commandes suivante devrait faire le truc:

  ALTER TABLE test1 ADD COLUMN id INTEGER;
  CREATE SEQUENCE test_id_seq OWNED BY test1.id;
  ALTER TABLE test ALTER COLUMN id SET DEFAULT nextval('test_id_seq');
  UPDATE test1 SET id = nextval('test_id_seq');

Encore une fois, dans les versions récentes de Postgres, ceci est à peu près équivalent à la commande unique ci-dessus.

236
répondu leonbloy 2017-05-17 14:44:00
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

C'est tout ce dont vous avez besoin:

  1. ajouter la colonne id
  2. Remplissez-le avec une séquence de 1 à count (*).
  3. définissez - le comme clé primaire / NOT null.

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

42
répondu Synesso 2015-06-21 23:05:13

Pour utiliser une colonne d'identité dans v10,

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/en/sequences-gains-and-pitfalls/.

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

1
répondu jhoanna 2018-03-07 03:38:22

J'ai atterri ici parce que je cherchais quelque chose comme ça aussi. Dans mon cas, je copiais les données d'un ensemble de tables intermédiaires avec plusieurs colonnes dans une table tout en assignant des ID 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'avoir un espace réservé pour cela dans L'instruction Insert. Ensuite, une simple sélection * dans la table cible auto 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;
0
répondu Dean Sha 2017-11-22 21:10:45