Remplacer la colonne string(varchar) par un entier

Guide rapide pour remplacer la colonne string(varchar) par un entier en changeant le type de champ de string à long.

Description description

Environnements

  • Adobe Campaign Classic (ACC)
  • Adobe Campaign (AC)

Problème

Une colonne d’une table qui, bien que de type string, contient des nombres et contient toujours des nombres.

Existe-t-il un moyen de modifier le type de colonne de varchar à int, sans perdre tous les nombres déjà présents ?

Par exemple, existe-t-il un moyen d’exécuter alter la commande (comme ci-dessous) ou toute autre approche telle que :

alter table myTable alter column vColumn int;

Résolution resolution

Solutions

Solution 1 :

  1. Introduisez une colonne temporaire de type int.
  2. Mettez à jour la base de données.
  3. Créez un workflow pour copier la valeur de votre colonne d’origine dans la nouvelle colonne.
  4. Modifiez le type de la colonne et mettez à jour la base de données.
  5. Créez un workflow pour copier la valeur de la colonne introduite à l’étape 1 dans la colonne d’origine.
  6. Supprimez la colonne temporaire et mettez à jour la base de données.

Solution 2 (préférée) :

  1. Modifiez le schéma. Remplacez le type de champ string par long.
  2. Pendant UPDATE DB STRUCTURE, remplacez la commande ALTER par la commande ALTER ci-dessous, qui remplace le type de colonne par INTEGER :

ALTER TABLE NmsRecipient ALTER COLONNE SBoardingPass TYPE INTEGER À L’AIDE de sBoardingPass::integer;

https://neon.tech/postgresql/postgresql-tutorial/postgresql-change-column-type

      

Solution 2 est la meilleure option.  C’est exactement comme ça que nous gérons le ALTER TABLE pour les clients.

Ce ALTER TABLE est également un bon validateur de type de données.. Si l’une des lignes contient des données alpha, la conversion (ALTER TABLE) rebondit…  Si ça réussit, alors vous êtes tous prêts.

Le schéma doit être de la même manière INT et non string, et il entraîne toutes sortes de problèmes de performances qui ne peuvent pas être résolus même avec la mise à niveau du RDS de classe 3-4.

Si vous disposez d’un espace, il est recommandé de créer une table de sauvegarde (avec index) et de la chroniser :

select * into backup_nmsrecipient from nmsrecipient;

// add indexes to get accurate simulation

\timing

Par exemple :

ALTER TABLE backup_NmsRecipient ALTER COLUMN sBoardingPass TYPE INTEGER USING sBoardingPass::integer;

En règle générale, cela est fait sur les tables personnalisées qui ne bloquent pas, donc regardez pg_stat_activity.

Probablement, si la table nmsRecipient est volumineuse, elle sera bloquée pendant cette opération.

PostgreSQL doit reconstruire la table entière (comme un vide complet).

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f