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

Changer le type de champ varchar en entier :ne peut pas être converti automatiquement en entier de type

Il n'y a pas de transtypage implicite (automatique) de text ou varchar en integer (c'est-à-dire que vous ne pouvez pas passer un varchar à une fonction attendant integer ou assignez un varchar champ à un integer un), vous devez donc spécifier un transtypage explicite en utilisant ALTER TABLE ... ALTER COLUMN ... TYPE ... USING :

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 (trim(col_name)::integer);

pour supprimer l'espace blanc avant la conversion.

Cela aurait dû être évident à partir d'un message d'erreur si la commande était 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 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é le 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 persiste, elle n'est peut-être pas liée aux valeurs de colonne, mais les index sur cette colonne ou les valeurs par défaut de la colonne peuvent échouer au transtypage. 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.