J'ai une petite table et un certain champ contient le type " caractère variant ". J'essaie de le changer en " Integer " mais cela donne une erreur indiquant que la conversion n'est pas possible.
Y a-t-il un moyen de contourner cela ou devrais-je simplement créer une autre table et y apporter les enregistrements à l'aide d'une requête.
Le champ contient uniquement des valeurs entières.
SQL error: ERROR: column "MID" cannot be cast to type integer
SELECT
listes nommées explicitement , sans vous fier aux positions ordinales des colonnes. Cela dit, l'approche donnée dans les réponses préservera la position de la colonne.Réponses:
Il n'y a pas de conversion implicite (automatique) de
text
ouvarchar
versinteger
(c'est- à -dire que vous ne pouvez pas passer unvarchar
à une fonction attendueinteger
ou affecter unvarchar
champ à un champinteger
), vous devez donc spécifier un cast explicite en utilisant ALTER TABLE ... ALTER COLUMN ... TYPE. .. UTILISATION :Notez que vous pouvez avoir des espaces dans vos champs de texte; dans ce cas, utilisez:
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 testepsql
sur PostgreSQL 9.2: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.
la source
psql
beaucoup plus rapide et plus facile. J'ai écrit un peu de diatribe sur la convivialité de PgAdmin en ce qui concerne la sauvegarde et la restauration il y a quelque temps: blog.ringerc.id.au/2012/05cela a fonctionné pour moi.
changer la colonne varchar en int
eu:
chnged to
la source
Vous pouvez le faire comme:
ou essayez ceci:
Si vous souhaitez en savoir plus sur ce sujet, lisez cet article: https://kolosek.com/rails-change-database-column
la source
Essayez ceci, cela fonctionnera à coup sûr.
Lors de l'écriture de migrations Rails pour convertir une colonne de chaîne en un entier, vous diriez généralement:
Cependant, PostgreSQL se plaindra:
Le "conseil" vous indique essentiellement que vous devez confirmer que vous voulez que cela se produise, et comment les données doivent être converties. Dites simplement ceci dans votre migration:
Ce qui précède imite ce que vous savez des autres adaptateurs de base de données. Si vous avez des données non numériques, les résultats peuvent être inattendus (mais vous convertissez en entier, après tout).
la source
PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer: ""
erreur se produitJ'ai le même problème. Ensuite, j'ai réalisé que j'avais une valeur de chaîne par défaut pour la colonne que j'essayais de modifier. La suppression de la valeur par défaut a fait disparaître l'erreur :)
la source
Si vous avez accidentellement ou non mélangé des entiers avec des données texte, vous devez d'abord exécuter la commande de mise à jour ci-dessous (si ce n'est pas au-dessus, la modification de la table échouera):
la source
regexp_replace(col_name, '[^0-9.]','','g')
si vous essayez de supprimer les caractères indésirables et les espaces blancs. Vous auriez besoin de quelque chose d'un peu plus sophistiqué si vous voulez conserverNaN
etInf
et10E42
la notation scientifique, cependant.Si vous travaillez sur un environnement de développement (ou sur un environnement de production. Cela peut être une sauvegarde de vos données), effacez d'abord les données du champ DB ou définissez la valeur sur 0.
Après cela, pour exécuter la requête ci-dessous et après avoir exécuté avec succès la requête, vers le schéma de migration et après cela, exécutez le script de migration.
Je pense que cela vous aidera.
la source
J'ai eu le même problème. J'ai commencé à réinitialiser la valeur par défaut de la colonne.
la source