Eu tenho um arquivo csv onde alguns campos inteiros estão em branco (por exemplo, ,) ou têm um valor NA (por exemplo, NA ,). Quando carrego os dados (LOAD DATA LOCAL INFILE...) em uma tabela o MySQL avisa corretamente que os campos possuem valores inteiros incorretos, porém insere um 0, não o valor DEFAULT especificado no CREATE TABLE DDL, nas colunas. Existe alguma maneira de especificar o valor a ser usado em caso de valores incorretos em um arquivo de dados?
relate perguntas
-
Existem ferramentas de benchmarking do MySQL? [fechado]
-
Onde posso encontrar o log lento do mysql?
-
Como posso otimizar um mysqldump de um banco de dados grande?
-
Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?
-
Como um grupo pode rastrear alterações no esquema do banco de dados?
Quando você precisa "limpar" os dados recebidos, há duas técnicas a serem consideradas. Suponha que a coluna
foo
precise ser-1
para representar"NA"
:Usando
@variables
...LOAD
em e@variable
, então useSET
para manipular o valor enquanto o armazena. Há exemplos nos documentos. No seu caso, você pode usar algo comoSET foo := IF(@foo = 'NA', -1, @foo)
dentro daLOAD DATA
instrução.Usando uma tabela temporária...
Em vez de
LOADing
diretamente na tabela de destino, carregue em uma tabela separada (possívelTEMPORARY
). Em seguida, tenha algumas instruções SQL para manipular os dados nessa tabela antes de copiar para a tabela "real". No seu caso:UPDATE tmp SET foo = -1 WHERE foo = 'NA';
. EntãoINSERT INTO real SELECT * FROM tmp;
. Notefoo
seriaVARCHAR
emtmp
apesar de estarINT
emreal
.A abordagem de tabela temporária pode lidar com transformações mais complexas.