Modifier le type de champ de type varchar en entier: “ne peut pas être lancé automatiquement au type integer”
J'ai une petite table et un certain champ contient le type "character varying". Je suis en train de changer pour "Entier", mais il donne une erreur de casting n'est pas possible.
Est-il un moyen de contourner ce ou devrais-je créer une autre table et apporter les enregistrements à l'aide d'une requête.
Le champ contient uniquement des valeurs entières.
- Ce spécifique ALTER TABLE avez-vous essayé et quel a été le message d'erreur spécifique?
- J'ai essayé à l'aide de alter de phppgadmin. Sélectionné la colonne et essayé de saisir le nouveau type de champ. L'erreur est:
SQL error: ERROR: column "MID" cannot be cast to type integer
- La première est de sauvegarder la table. Vous pouvez ensuite créer une autre colonne (dire champ2) de type entier dans la même table. Sélectionnez la distribution à valeur entière dans le champ1 champ2 . Puis renommer la colonne.
- mais la nouvelle colonne tombe à la fin de la table de droite? Je ne peux pas l'avoir dans la même position?
- oui vous l'aurez dernière.
- hmm, essayez celui-ci postgresonline.com/journal/archives/...
- Se soucier des positions des colonnes est généralement le signe d'une terrible la conception de l'application. Vous souhaitez presque toujours à l'aide de nommer explicitement les colonnes et
SELECT
listes, en ne s'appuyant pas sur la colonne de positions ordinales. Cela dit, l'approche adoptée dans les réponses de préserver la position de la colonne.
Vous devez vous connecter pour publier un commentaire.
Il n'est pas implicite (automatique) en fonte à partir de
text
ouvarchar
àinteger
(c'est à dire vous ne pouvez pas passer unvarchar
à une fonction attendinteger
ou attribuer unevarchar
champ à uneinteger
un), vous devez spécifier un cast explicite à l'aide de ALTER TABLE ... ALTER COLUMN ... TYPE ... À L'AIDE:Notez que vous pouvez avoir des espaces dans vos champs de texte; dans ce cas, utilisez:
à enlever les espaces blancs avant de les convertir.
Ce shoud ai été évident à partir d'un message d'erreur si la commande a été exécutée dans
psql
, mais il est possible de PgAdmin III n'est pas de vous montrer le message d'erreur. Voici ce qui se passe si je l'ai tester danspsql
sur PostgreSQL 9.2:Merci @muistooshort pour l'ajout de la
USING
lien.Voir aussi cette question relative à la; il est sur les Rails migrations, mais la cause sous-jacente est la même et la réponse s'applique.
psql
beaucoup plus rapide et plus facile. J'ai écrit un peu un coup de gueule à propos de PgAdmin convivialité en ce qui concerne la sauvegarde et la restauration il y a un moment: blog.ringerc.id.au/2012/05/...cette a fonctionné pour moi.
changement de colonne de type varchar int
obtenu:
chnged à
'integer USING CAST(column_name AS integer)'
. oh, la réponse est: NON. erreur de syntaxe dans MySQL. Aucun moyen de s'adapter à la fois.PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer: ""
erreur survientVous pouvez le faire comme:
ou essayez ceci:
Si vous êtes intéressé pour en savoir plus sur ce sujet, lire cet article: https://kolosek.com/rails-change-database-column
Essayer cela, il va travailler pour vous.
Lors de l'écriture de Rails migrations pour convertir une colonne de type chaîne en un entier, tu avais l'habitude de dire:
Cependant, PostgreSQL va se plaindre:
Le "conseil" raconte essentiellement que vous devez confirmer que vous voulez que cela se produise, et la façon dont les données doivent être converties. Juste dire ceci dans votre migration:
Ci-dessus est imiter ce que vous connaissez d'autres adaptateurs base de données. Si vous avez des données non numériques, les résultats peuvent être inattendus (mais vous êtes à la conversion d'un entier, après tout).
PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer: ""
erreur se produitJ'ai eu le même problème.
Que j'ai réalisé que j'avais un défaut de la chaîne de valeur pour la colonne j'ai essayé de la modifier.
Retrait de la valeur par défaut fait disparaître l'erreur 🙂
Si vous avez accidentellement ou non mixte en nombres entiers avec les données de texte que vous devrait à la première exécution en dessous de commande de mise à jour (si ce n'est au-dessus de l'instruction alter table échouera):
regexp_replace(col_name, '[^0-9.]','','g')
si vous essayez de bande de caractères indésirables et white-space. Vous auriez besoin de quelque chose d'un peu plus sophistiqué si vous souhaitez conserverNaN
etInf
et10E42
notation scientifique, bien que.Si vous travaillez sur l'environnement de développement(ou sur pour la production env. il peut être une sauvegarde de vos données) puis la première à effacer les données de la DB champ ou définissez la valeur 0.
Mise à JOUR table_mame ENSEMBLE nom_champ= 0;
Après que, pour exécuter la requête ci-dessous et après avoir réussi à exécuter la requête, à la schemamigration et après cela, exécutez le migrer script.
ALTER TABLE table_mame ALTER COLUMN field_name de TYPE numérique(10,0) à l'AIDE de field_name::numérique;
Je pense que ça va vous aider.