Il n'y a pas de conversion implicite (automatique) de text
ou varchar
vers integer
(c'est- à -dire que vous ne pouvez pas passer un varchar
à une fonction attendue integer
ou affecter un varchar
champ à 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 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 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.