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?
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.
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
C'est tout ce dont vous avez besoin:
- ajouter la colonne
id
- Remplissez-le avec une séquence de 1 à count (*).
- définissez - le comme clé primaire / NOT null.
Le crédit est donné à @resnyanskiy qui a donné cette réponse dans un commentaire.
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/.
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;