210 votes

Changer le type du champ varchar en entier : "ne peut pas être converti automatiquement en type integer".

J'ai une petite table et un certain champ contient le type " caractère variable ". J'essaie de le changer en " Entier mais le message d'erreur suivant s'affiche : "Le moulage n'est pas possible.

Existe-t-il un moyen de contourner ce problème ou dois-je simplement créer une autre table et y placer les enregistrements à l'aide d'une requête ?

Le champ ne contient que des valeurs entières.

0 votes

Quel ALTER TABLE spécifique avez-vous essayé et quel était le message d'erreur spécifique ?

0 votes

@muistooshort J'ai essayé d'utiliser alter depuis phppgadmin. J'ai sélectionné la colonne et essayé de saisir le nouveau type de champ. L'erreur est la suivante : SQL error: ERROR: column "MID" cannot be cast to type integer

3 votes

La première est de sauvegarder la table. Ensuite, vous pouvez créer une autre colonne (disons field2) de type entier dans la même table. Sélectionnez le cast to integer value du field1 dans le field2 . Puis renommez la colonne.

341voto

Craig Ringer Points 72371

Il n'y a pas de cast implicite (automatique) de text o varchar a integer (c'est-à-dire que vous ne pouvez pas passer un varchar à une fonction qui attend integer ou assigner un varchar à un champ integer ), vous devez donc spécifier une distribution explicite en utilisant la fonction MODIFIER LA TABLE ... ALTERNER LA COLONNE ... TYPE ... USING :

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);

Notez que vous pouvez avoir des espaces blancs dans vos champs de texte ; dans ce cas, utilisez :

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);

pour supprimer les espaces blancs avant la conversion.

Cela aurait dû être évident à partir d'un message d'erreur si la commande a été exécutée en psql mais il est possible que PgAdmin-III ne vous montre pas l'erreur complète. Voici ce qui se passe si je le teste dans l'application psql sur PostgreSQL 9.2 :

=> CREATE TABLE test( x varchar );
CREATE TABLE
=> insert into test(x) values ('14'), (' 42  ');
INSERT 0 2
=> ALTER TABLE test ALTER COLUMN x TYPE integer;
ERROR:  column "x" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion. 
=> ALTER TABLE test ALTER COLUMN x TYPE integer USING (trim(x)::integer);
ALTER TABLE        

Merci @muistooshort d'avoir ajouté la USING lien.

Voir aussi cette question connexe ; il s'agit de migrations Rails, mais la cause sous-jacente est la même et la réponse s'applique.

Si l'erreur se produit toujours, il se peut qu'elle ne soit pas liée aux valeurs de la colonne, mais que les index sur cette colonne ou les valeurs par défaut de la colonne échouent au typage. Les index doivent être supprimés avant ALTER COLUMN et recréés après. Les valeurs par défaut doivent être modifiées de manière appropriée.

0 votes

Merci d'avoir pris le temps. Mais je ne parviens pas à le faire fonctionner. J'ai essayé votre ligne ALTER et cela me donne une erreur "Syntax error near Using" (erreur de syntaxe près de l'utilisation)

0 votes

Ma déclaration : ALTER TABLE "tblMenus" ALTER COLUMN "MID" USING (trim("MID")::integer) ;

1 votes

@itsols Entièrement mon erreur ; je l'ai corrigée juste en voyant votre commentaire. Voir la révision. C'était bien dans le code de la démo, mais pas dans l'exemple générique du début.

78voto

bibangamba Points 61

este a fonctionné pour moi.

changer la colonne varchar en int

change_column :table_name, :column_name, :integer

obtenu :

PG::DatatypeMismatch: ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.

changée pour

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

0 votes

Avez-vous essayé cet exercice avec des données et vos données étaient-elles intactes ?

4 votes

Tant que ce qui est dans la colonne est un nombre entier, oui

0 votes

Ça ne marche pas avec moi. J'utilise ruby 2.2.3 avec rails 4.2.3.

28voto

Nebojsa Zoric Points 41

Tu peux le faire comme ça :

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

ou essayez ceci :

change_column :table_name, :column_name, :integer, using: 'column_name::integer'

Si vous souhaitez en savoir plus sur ce sujet, lisez cet article : https://kolosek.com/rails-change-database-column

9voto

Subhash Chandra Points 1956

Essayez ceci, ça va marcher à coup sûr.

Lorsque vous écrivez des migrations Rails pour convertir une colonne de chaînes de caractères en un nombre entier, vous dites généralement :

change_column :table_name, :column_name, :integer

Cependant, PostgreSQL se plaindra :

PG::DatatypeMismatch: ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.

L'"indice" vous indique essentiellement que vous devez confirmer que vous voulez que cela se produise, et comment les données seront converties. Dites-le simplement dans votre migration :

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

Ce qui précède imitera ce que vous connaissez des autres adaptateurs de base de données. Si vous avez des données non numériques, les résultats peuvent être inattendus (mais vous convertissez en un nombre entier, après tout).

8voto

J'ai eu le même problème. Puis j'ai réalisé que j'avais une valeur de chaîne par défaut pour la colonne que j'essayais de modifier. La suppression de la valeur par défaut a fait disparaître l'erreur :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X