PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment changer un ID de table de série en identité ?

BEGIN;
ALTER TABLE public.client ALTER clientid DROP DEFAULT; -- drop default

DROP SEQUENCE public.client_clientid_seq;              -- drop owned sequence

ALTER TABLE public.client
-- ALTER clientid SET DATA TYPE int,                   -- not needed: already int
   ALTER clientid ADD GENERATED ALWAYS AS IDENTITY (RESTART 108);
COMMIT;

Il y a deux variables :

  • le nom réel de la SEQUENCE jointe . J'ai utilisé le nom par défaut ci-dessus, mais le nom peut différer.
  • la valeur maximale actuelle dans client.clientid . N'a pas besoin d'être 107, simplement parce qu'il y a actuellement 107 lignes.

Cette requête obtient les deux :

SELECT pg_get_serial_sequence('client', 'clientid'), max(clientid) FROM client;

Un serial colonne est un integer colonne qui possède une séquence dédiée et a son jeu par défaut pour en tirer (comme on peut le voir dans la définition de table que vous avez publiée). Pour en faire un integer simple , supprimez la valeur par défaut, puis supprimez la séquence.

Conversion de la colonne en IDENTITY ajoute sa propre séquence. Vous devez supprimez l'ancienne séquence possédée (ou au moins la propriété, qui meurt avec la suppression de la séquence). Sinon, vous obtenez des erreurs telles que :

Comment copier la structure et le contenu d'un tableau, mais avec une séquence séparée ?

Convertissez ensuite l'integer brut colonne à un IDENTITY colonne, et redémarrez avec le maximum actuel plus 1 . Vous devez définissez la valeur actuelle de la nouvelle séquence interne pour éviter les violations uniques.

Enveloppez le tout dans une seule transaction, afin de ne pas vous tromper à mi-chemin de la migration. Toutes ces commandes DDL sont transactionnelles dans Postgres, peuvent être annulées jusqu'à ce qu'elles soient validées et ne sont visibles que pour les autres transactions commençant après cela.

Votre colonne était PK avant et reste PK. Ceci est orthogonal au changement.

Peter Eisentraut, l'auteur principal du (nouveau dans Postgres 10) IDENTITY fonctionnalité, a également fourni une fonction upgrade_serial_to_identity() pour convertir le serial existant Colonnes. Il réutilise la séquence existante et met à jour directement les catalogues système - ce que vous ne devriez pas faire vous-même, sauf si vous savez exactement ce que vous faites. Il couvre également les cas de coin exotiques. Découvrez-le (chapitre "Mise à jour") :

Cependant, la fonction ne fonctionnera pas sur la plupart des services hébergés qui ne permettent pas la manipulation directe des catalogues système. Ensuite, vous revenez aux commandes DDL comme indiqué en haut.

Connexe :