Il n'y a pas de conversion implicite (automatique) de textou varcharvers integer(c'est- à -dire que vous ne pouvez pas passer un varcharà une fonction attendue integerou affecter un varcharchamp à un champ integer), vous devez donc spécifier un cast explicite en utilisant ALTER TABLE ... 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 (trim(col_name)::integer);
pour supprimer l'espace blanc avant la conversion.
Cela devrait être évident à partir d'un message d'erreur si la commande a été exécutée 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 psqlsur 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 USINGlien.
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 peut ne pas être liée aux valeurs de colonne, mais les index sur cette colonne ou les valeurs par défaut de cette colonne peuvent échouer le 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.