J'ai une table avec des données existantes. Existe-t-il un moyen d'ajouter une clé primaire sans supprimer ni recréer la table?
190
J'ai une table avec des données existantes. Existe-t-il un moyen d'ajouter une clé primaire sans supprimer ni recréer la table?
( Mise à jour - Merci aux personnes qui ont commenté )
Supposons que vous ayez une table nommée test1
, à laquelle vous souhaitez ajouter une id
colonne de clé primaire (substitut) à incrémentation automatique . La commande suivante devrait être suffisante dans les versions récentes de PostgreSQL:
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Dans les anciennes versions de PostgreSQL (antérieures à 8.x?), Vous deviez faire tout le sale boulot. La séquence de commandes suivante devrait faire l'affaire:
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, cela équivaut à peu près à la commande unique ci-dessus.
ADD PRIMARY KEY
crée également uneNOT NULL
contrainte (testée dans postgres 9.3) comme prévu et souhaité.ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
C'est tout ce dont vous avez besoin pour:
id
colonneLe crédit est donné à @resnyanskiy qui a donné cette réponse dans un commentaire.
la source
ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
Pour utiliser une colonne d'identité dans la v10,
Pour une explication des colonnes d'identité, voir https://blog.2ndquadrant.com/postgresql-10-identity-columns/ .
Pour connaître la différence entre GENERATED BY DEFAULT et GENERATED ALWAYS, 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/ .
la source
SQL Error [23502]: ERROR: column "id" contains null values
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 intermédiaires avec de nombreuses colonnes dans une table tout en affectant également 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'avoir un espace réservé pour cela 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.
la source