Changer le type du champ varchar en entier: “ne peut pas être converti automatiquement en type entier”

J’ai une petite table et un certain champ contient le type ” caractère variable “. J’essaie de le changer en ” Integer ” mais cela donne une erreur que le casting n’est pas possible.

Y a-t-il un moyen de contourner cela ou devrais-je simplement créer une autre table et y insérer les enregistrements en utilisant une requête.

Le champ contient uniquement des valeurs entières.

Il n’y a pas de conversion implicite (automatique) de text ou varchar en integer (c.-à-d. Vous ne pouvez pas passer un varchar à une fonction attendant un integer ou assigner un champ varchar à un integer ) . ALTER COLUMN … TYPE … UTILISATION :

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

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

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

pour supprimer les espaces blancs avant la conversion.

Cela aurait été évident à partir d’un message d’erreur si la commande était exécutée dans psql , mais il est possible que PgAdmin-III ne vous montre pas toute l’erreur. Voici ce qui arrive si je le teste en 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 (sortingm(x)::integer); ALTER TABLE 

Merci @muistooshort pour avoir ajouté le lien USING .

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.

Cela a fonctionné pour moi.

changer la colonne varchar en int

 change_column :table_name, :column_name, :integer 

eu:

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

chnged à

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

Essayez ceci, cela fonctionnera à coup sûr.

Lorsque vous écrivez des migrations Rails pour convertir une colonne de type chaîne en un 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. 

Le «conseil» vous indique essentiellement que vous devez confirmer que vous voulez que cela se produise et comment les données doivent être 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 savez des autres adaptateurs de firebase database. Si vous avez des données non numériques, les résultats peuvent être inattendus (mais après tout, vous convertissez un nombre entier).

J’ai le même problème. Alors j’ai réalisé que j’avais une valeur de chaîne par défaut pour la colonne que j’essayais de modifier. Supprimer la valeur par défaut a fait disparaître l’erreur 🙂

Vous pouvez le faire comme:

 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 êtes intéressé pour en savoir plus sur ce sujet, lisez cet article: https://kolosek.com/rails-change-database-column

Si vous avez accidentellement ou non mélangé des entiers avec des données texte, exécutez-les d’abord sous la commande update (si ce n’est pas le cas, modifier la table échouera):

 UPDATE the_table SET col_name = replace(col_name, 'some_ssortingng', ''); 

Si vous travaillez sur un environnement de développement (ou sur pour la production env., Il est possible que vos données soient sauvegardées), puis effacez les données du champ de la firebase database ou définissez la valeur sur 0.

UPDATE nom_table SET nom_champ = 0;

Après cela, pour exécuter la requête ci-dessous et après avoir exécuté la requête avec succès, accédez à la migration de schéma et exécutez ensuite le script de migration.

ALTER TABLE table_mame ALTER COLUMN nom_de_chapeau TYPE numeric (10,0) USING nom_champ :: numeric;

Je pense que cela vous aidera.