Il n'y a pas de cast implicite (automatique) de text
o varchar
a integer
(c'est-à-dire que vous ne pouvez pas passer un varchar
à une fonction qui attend integer
ou assigner un varchar
à un champ integer
), vous devez donc spécifier une distribution explicite en utilisant la fonction MODIFIER LA TABLE ... ALTERNER LA COLONNE ... TYPE ... USING :
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Notez que vous pouvez avoir des espaces blancs 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 les espaces blancs avant la conversion.
Cela aurait dû être évident à partir d'un message d'erreur si la commande a été 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 l'application 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é la 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 se produit toujours, il se peut qu'elle ne soit pas liée aux valeurs de la colonne, mais que les index sur cette colonne ou les valeurs par défaut de la colonne échouent au 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.
0 votes
Quel ALTER TABLE spécifique avez-vous essayé et quel était le message d'erreur spécifique ?
0 votes
@muistooshort J'ai essayé d'utiliser alter depuis phppgadmin. J'ai sélectionné la colonne et essayé de saisir le nouveau type de champ. L'erreur est la suivante :
SQL error: ERROR: column "MID" cannot be cast to type integer
3 votes
La première est de sauvegarder la table. Ensuite, vous pouvez créer une autre colonne (disons field2) de type entier dans la même table. Sélectionnez le cast to integer value du field1 dans le field2 . Puis renommez la colonne.
0 votes
@Igor mais la nouvelle colonne se trouve à la fin du tableau, n'est-ce pas ? Ne puis-je pas l'avoir à la même position ?
0 votes
Oui, vous l'aurez en dernier.
0 votes
Hmm, essayez celui-là postgresonline.com/journal/archives/
2 votes
Le fait de se soucier de la position des colonnes est généralement le signe d'une conception déficiente de l'application. Vous voulez presque toujours utiliser des colonnes explicitement nommées et des fichiers de type
SELECT
des listes, sans s'appuyer sur les positions ordinales des colonnes. Cela dit, l'approche donnée dans les réponses préservera la position des colonnes.