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.