Eu tenho uma tabela pequena e um determinado campo contém o tipo " caractere variável ". Estou tentando alterá-lo para " Inteiro ", mas dá um erro que a conversão não é possível.
Existe uma maneira de contornar isso ou devo apenas criar outra tabela e trazer os registros para ele usando uma consulta.
O campo contém apenas valores inteiros.
SQL error: ERROR: column "MID" cannot be cast to type integer
SELECT
listas nomeadas explicitamente , sem depender das posições ordinais das colunas. Dito isto, a abordagem dada nas respostas preservará a posição da coluna.Respostas:
Não há conversão implícita (automática) de
text
ouvarchar
parainteger
(ou seja, você não pode passar avarchar
para uma função esperandointeger
ou atribuir umvarchar
campo a umainteger
), portanto, você deve especificar uma conversão explícita usando ALTER TABLE ... ALTER COLUMN ... TYPE. .. USANDO :Observe que você pode ter espaços em branco nos seus campos de texto; nesse caso, use:
para remover o espaço em branco antes da conversão.
Isso deve ser óbvio em uma mensagem de erro se o comando foi executado
psql
, mas é possível que o PgAdmin-III não esteja mostrando o erro completo. Aqui está o que acontece se eu testá-lo nopsql
PostgreSQL 9.2:Obrigado @muistooshort por adicionar o
USING
link.Veja também esta questão relacionada ; trata-se de migrações do Rails, mas a causa subjacente é a mesma e a resposta se aplica.
Se o erro ainda ocorrer, ele pode estar relacionado não aos valores da coluna, mas os índices nessa coluna ou nos valores padrão da coluna podem falhar na conversão de tipo. Os índices precisam ser eliminados antes de ALTER COLUMN e recriados depois. Os valores padrão devem ser alterados adequadamente.
fonte
psql
muito mais rápido e fácil. Eu escrevi um pouco de um discurso retórico sobre PgAdmin usabilidade com relação ao backup e restaurar um tempo atrás: blog.ringerc.id.au/2012/05/...isso funcionou para mim.
alterar coluna varchar para int
obteve:
ligado a
fonte
Você pode fazê-lo como:
ou tente o seguinte:
Se você estiver interessado em saber mais sobre este tópico, leia este artigo: https://kolosek.com/rails-change-database-column
fonte
Tente isso, ele funcionará com certeza.
Ao escrever migrações do Rails para converter uma coluna de string em um número inteiro, você costuma dizer:
No entanto, o PostgreSQL irá reclamar:
A "dica" basicamente informa que você precisa confirmar que deseja que isso aconteça e como os dados serão convertidos. Apenas diga isso em sua migração:
O acima irá imitar o que você sabe de outros adaptadores de banco de dados. Se você tiver dados não numéricos, os resultados podem ser inesperados (mas você está convertendo para um número inteiro).
fonte
PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer: ""
erro aconteceEu tenho o mesmo problema. Do que percebi, eu tinha um valor de string padrão para a coluna que estava tentando alterar. A remoção do valor padrão fez com que o erro desaparecesse :)
fonte
Se você acidentalmente ou não misturou números inteiros com dados de texto, deve executar primeiro o comando abaixo de atualização (se não estiver acima da tabela de alteração falhará):
fonte
regexp_replace(col_name, '[^0-9.]','','g')
se estivesse tentando retirar caracteres indesejados e espaços em branco. Você precisa de algo um pouco mais sofisticado, se você deseja manterNaN
eInf
e10E42
notação científica, no entanto.Se você estiver trabalhando no ambiente de desenvolvimento (ou no ambiente de produção, pode fazer backup dos seus dados), primeiro limpe os dados do campo DB ou defina o valor como 0.
Depois disso, execute a consulta abaixo e depois execute com êxito a consulta, para a migração de esquema e depois execute o script de migração.
Eu acho que isso vai te ajudar.
fonte
Eu tive o mesmo problema. Comecei a redefinir o padrão da coluna.
fonte