Sei sulla pagina 1di 5

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.

txt'

[REPLACE | IGNORE]

INTO TABLE nome_tabela

[FIELDS

A instruo LOAD DATA INFILE l linhas de uma arquivo texto para uma tabela em uma velocidade muito alta. Se a palavra-chave LOCAL especificada, ela interpretada com respeito ao fim da conexo do cliente. QuandoLOCAL especificado, o arquivo lido pelo programa cliente na mquina cliente e enviada ao servidor. Se LOCAL no especificada, o arquivo deve estar localizado na mquina servidora e lida diretamente pelo servidor ( LOCAL est disponvel no MySQL Verso 3.22.6 ou posterior). Por razes de segurana, ao ler arquivos textos no servidor, os arquivos devem tambm estar no diretrio de banco de dados ou serem lidos por todos. Tambm, para utilizar LOAD DATA INFILE em arquivos do servidor, voc deve ter privilgio FILE na mquina servidora. See Seco 4.3.7, Privilgios Fornecidos pelo MySQL. A partir do MySQL 3.23.49 e MySQL 4.0.2 (4.0.13 no Windows) LOCAL s funcionar se o seu servidor e o seu cliente forem habilitados para permitir isto. Por exemplo so o mysqld foi iniciado com --localinfile=0, LOCALno ir funcionar. See Seco 4.3.4, Detalhes de Segurana com LOAD DATA LOCAL.

Se voc especificar a palavra-chave LOW_PRIORITY , a execuo da instruo LOAD DATA atrasada at nenhum outro cliente estar lendo a tabela. Se voc especificar a palavra-chave CONCURRENT com uma tabela MyISAM, outras threads podem retornar dados da tabela enquanto LOAD DATA est executando. Utilizar esta opo ir afetar o desempenho de LOAD DATA um pouco, mesmo se nenhuma outra thread utilizar a tabela ao mesmo tempo. Utilizar LOCAL ser um pouco mais lento que deixar o servidor acessar os arquivos diretamente, pois o contedo do arquivo deve ser enviado pela conexo da mquina cliente at a mquina servidora. Por outro lado, voc no precisa de ter o privilgio FILE para carregar arquivos locais. Se voc estiver utilizando uma verso do MySQL anterior a 3.23.24, voc no poder ler de um FIFO com LOAD
DATA INFILE. Se voc precisar ler de um FIFO (por exemplo a sada de gunzip), utilize LOAD DATA LOCAL INFILE .

Voc tambm pode carregar arquivo de dados utilizado o utilitrio mysqlimport ; ele opera enviando um comando LOAD DATA INFILE para o servidor. A opo --local faz com que mysqlimport leia ao arquivo de dados a partir da mquina cliente. Voc pode especificar a opo --compress para conseguir melhor desempenho sobre redes lentas se o cliente e o servidor suportar protocolos compactados. Ao localizar arquivos na mquina servidora, o servidor utiliza as segintes regras: Se um caminho absoluto dado, o servidor utiliza o caminho desta forma. Se um caminho relativo com um ou mais componentes dados, o servidor busca o arquivo em relao ao diretrio de dados do servidor. Se um nome de arquivo sem nenhum componente dado, o servidor procura pelo arquivo no diretorio de banco de dados do banco de dados atual. Note que estas regras significam que um arquivo chamado ./myfile.txt lido no diretrio de dados do servidor, enquanto um arquivo chamado myfile.txt l o diretrio de dados do naco de dados atual. Por exemplo, a seguinte instruo LOAD DATA l o arquivo data.txt do diretrio de dados de db1 pois db1 o banco de dados atual, mesmo que a instruo carrega explicitamente o arquivo em uma tabela no banco de dados db2 :
mysql> USE db1;mysql> LOAD DATA INFILE "data.txt" INTO TABLE db2.my_table;

As palavras-chave REPLACE e IGNORE controlam o tratamento de entrada de registros que duplicam linhas existentes em valores de chave nica. Se voc especificar REPLACE , as linhas inseridas substituiro as linhas existentes (em outras palavras, linhas que tiverem o mesmo valor de um ndice primrio ou nico como linhas existentes). See Seco 6.4.7, SintaxeREPLACE . Se voc especificar IGNORE, registros inseridos que duplicam uma linha existente em um valor de chave nica ser ignorados. Se voc no especificar nenhuma das opes, o comportamento depende de se a palavra chaveLOCAL especificada ou no. Sem LOCAL , um erro ocorre quando um valor de chave duplicada encontrado, e o resto do arquivo texto ignorado. Com LOCAL o comportamento padro o mesmo de quando IGNORE for especificado, isto porque o servidor no tem como parar no meio da operao. Se voc quiser ignorar as restries de chaves estrangeiras durante a carga voc pode faze SET
FOREIGN_KEY_CHECKS=0 antes de executar LOAD DATA .

Se voc utiliza LOAD DATA INFILE em uma tabela MyISAM vazia, todos os ndices no-nicos so criados em um

batch separado (como em REPAIR). Isto normalmente torna LOAD DATA INFILE muito mais rpido quando voc tem diversos ndices. Normalmente isto muito rpido mas em casos extremos voc pode tornar o ndice mais rpido ainda desligando-os com ALTER TABLE .. DISABLE KEYS e usando ALTER TABLE .. ENABLE
KEYS para recriar os ndices. See Seco 4.5.6, Utilizando myisamchk para Manuteno de Tabelas e

Recuperao em Caso de Falhas.


LOAD DATA INFILE o complemento de SELECT ... INTO OUTFILE . See Seco 6.4.1, Sintaxe SELECT.

Para gravar dados de uma tabela em um arquivo, use SELECT ... INTO OUTFILE. Para ler o arquivo de volta em uma tabela, use LOAD DATA INFILE. A sintaxe das clusulas FIELDS e LINES a mesma para ambos os comandos. Ambas as clusulas so opicionais, mas FIELDS deve preceder LINES se ambos so especificados. Se voc especificar uma clusula FIELDS, cada uma das subclusulas ( TERMINATED BY , [OPTIONALLY]
ENCLOSED BY, e ESCAPED BY) tambm so opicionais, exceto pelo fato de que voc deve especificar pelo menos

uma delas. Se voc no especificar uma clusula FIELDS , o padro o mesmo que se voc tivesse escrito isto:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'

Se voc no especificar uma clusula LINES, o padro o mesmo que se voc tivesse escrito isto:
LINES TERMINATED BY '\n'

Nota: Se voc gerou o arquivo texto no Windows, voc deve alterar o mostrado acima para: LINES TERMINATED
BY '\r\n' j que o Windows utiliza dois caracteres como um terminador de linha. Alguns programas

comowordpad , pode usar \r como terminador de linha. Se todas as linas que voc deseja ler tem um prefixo comum que voc quer saltar, voc pode usar LINES
STARTING BY prefix_string .

Em outras palavras, o padro faz com que LOAD DATA INFILE funcione da seguinte maneira ao se ler uma entrada: Procure pelo limite da linha em linhas novas. Se LINES STARTING BY prefix for usado, l at que o prefixo seja encontrado e comea a ler o caracter seguinte ao prefixo. Se a linha no inclui o prefico e;a ser saltada. Quebre a linha em campos na tabulaes. No espere que os campos estejam entre aspas. Interprete a ocorrncia de tabulaes, novas linhas ou \ precedidos por \ como caracteres literias que so parte dos valores dos campos. Inversamente, os padres fazem SELECT ... INTO OUTFILE funcionar da seguinte forma ao escrever as sadas: Escreva tabulaes entre os campos. No coloque campos entre aspas. Utilize \ para considerar como parte dos campos instncias de tabulao, nova linha ou \ que estejam dentro dos valores dos campos. Escreva novas linhas no fim de cada linha. Note que para escrever FIELDS ESCAPED BY '\\' , voc deve especificar duas barras invertidas para que o valor seja lido como uma nica barra invertida. A opo IGNORE nmero LINES pode ser utilizado para ignorar linhas no inicio do arquivo. Por exemplo, voc pode usar IGNORE 1 LINES para saltar uma linha de cabealho contendo nomes de colunas:
mysql> LOAD DATA INFILE "/tmp/file_name" INTO TABLE test IGNORE 1 LINES;

Quando voc utiliza SELECT ... INTO OUTFILE em conjunto com LOAD DATA INFILE para escrever os dados de um banco de dados em um arquivo e ento ler o arquivo de volta no banco de dados posteriormente, as opes para tratamento de linhas e campos para ambos os comandos devem coincidir. Seno, LOAD DATA
INFILE no ir interpretar o contedo do arquivo de forma apropriada. Suponha que voc utilize SELECT ... INTO OUTFILE para escrever um arquivo com os campos separados por vrgulas: mysql> SELECT * INTO OUTFILE 'data.txt' ->
FIELDS TERMINATED BY ','

->

FROM ...;

Para ler o arquivo delimitado com vrgula de volta, a instruo correta seria:

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2

->

FIELDS TERMINATED BY ',';

Se voc tentasse ler do arquivo com a instruo abaixo, no iria funcionar pois ela instrui LOAD DATA INFILE a procurar por tabulaes entre campos:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2 ->
FIELDS TERMINATED BY '\t';

O resultado desejado que cada linha de entrada fosse interpretada como um nico campo.
LOAD DATA INFILE pode ser usado para ler arquivos obtidos de fontes externas. Por exemplo, um arquivo no

formato dBASE ter campos separados por vrgulas e entre aspas duplas. Se as linhas no arquivo so terminadas por com uma nova linha, o comando mostardo aqui ilustra as opes do tratamento de campos e linhas que voc usaria pra carregar o arquivo. the file:
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE nome_tabela ->
FIELDS TERMINATED BY ',' ENCLOSED BY '"'

->

LINES TERMINATED

Qualquer uma das opes de tratamento de campos e linhas podem especificar uma string vazia ( '' ). Se no for vazio, os valores de FIELDS [OPTIONALLY] ENCLOSED BY e FIELDS ESCAPED BY devem ser um caracter simples. Os valores de FIELDS TERMINATED BY e LINES TERMINATED BY podem ser mais de uma caracter. Por exemplo, para escrever linhas terminadas pelos par retorno de carro/alimentao de linha, ou para ler um arquivo contendo tais linhas, especifique uma clusula LINES TERMINATED BY '\r\n' . Por exemplo, para ler um arquivo de piadas, que so separadas com uma linha de %%, em uma tabela SQL, voc pode fazer:
CREATE TABLE jokes (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, joke TEXTNOT NULL);LOAD DATA INFILE "/tmp/jokes.txt" INTO TABLE jokes F FIELDS [OPTIONALLY] ENCLOSED BY controla a citao dos campos. Para saida ( SELECT ... INTO OUTFILE), se voc omitir a palavra OPTIONALLY, todos os campos estaro entra o caracter ENCLOSED BY. Um

exemplo de tal sada (usando vrgula como delimitador de campo) mostrado abaixo:
"1","a string","100.20""2","a string containing a , comma","102.20""3","a string containing a \" quote","102.20""4","a string containi

Se voc especificar OPTIONALLY , o caracter ENCLOSED BY s usados para delimitar campos CHAR e VARCHAR:
1,"a string",100.202,"a string containing a , comma",102.203,"a string containing a \" quote",102.204,"a string containing a \", quote

Note que a ocorrncia de caracter ENCLOSED BY dentro do valor do campo indicado colocando um caracter ESCAPED BY antes dele. Note tambm que se voc especificar um valor ESCAPED BY vazio, possvel gerar sadas que no podero ser lidas aprorpiadamente por LOAD DATA INFILE. Por exemplo, a sada mostrada seria apareceria como a seguir se o caracter de escape fosse vazio. Observe que o segundo campo na quarta linha contm uma vrgula seguida de aspas, o que (erroneamente) parece terminar o campo:
1,"a string",100.202,"a string containing a , comma",102.203,"a string containing a " quote",102.204,"a string containing a ", quote a

Para entrada, o caracter ENCLOSED BY , se presente, ser eliminado do fim dos valores dos campos. (Isto verdade se OPTIONALLY for especificado; OPTIONALLY no tem efeito na interpretao da entrada). A ocorrncia de caracteres ENCLOSED BY precedido pelo caracter ESCAPED BY so interpretados como parte do campo atual. Se o campo comea com o caracter ENCLOSED BY , instncias daquele caracter so reconhecidos como terminao de um valor do campo apenas se seguido pelo campo ou sequncia de linah TERMINATED BY. Para evitar ambiguidade, ocorrncias do caracter ENCLOSED BY dentro de um valor de campo pode ser duplicado e ser interpretado como uma nica instncia do caracter. Por exemplo, se ENCLOSED BY '"' for especificado, aspas sero tratadas como mostrado abaixo:
"The ""BIG"" boss" -> The "BIG" bossThe "BIG" boss -> The "BIG" bossThe ""BIG"" boss -> The ""BIG"" boss

FIELDS ESCAPED BY controla como escrever ou ler caracteres especiais. Se o caracter FIELDS ESCAPED BYno

estivaer vazio, ele ser usado para preceder o seguinte caracter de sada: O caracter FIELDS ESCAPED BY O caracter FIELDS [OPTIONALLY] ENCLOSED BY O primeiro caracter dos valores FIELDS TERMINATED BY e LINES TERMINATED BY ASCII 0 (o que escrito seguido de um caracter de escape ASCII '0', no o byte de valor zero). Se o caracter FIELDS ESCAPED BY estiver vazio, nenhum caracter ser ``escapado''. Provavelmente no uma boa idia especificar um caracter de escape vazio, principalmente se os valores dos campos em seus conter qualquer caracter na lista dada. Para entradas, se o caracter FIELDS ESCAPED BY no estiver vazio, as ocorrncias daquele caracter so

eliminadas e o caracter seguinte tomado como parte do valor do campo. As excees so um 0 ou N ``escapado'' (por exemplo, \0 ou \N se o caracter de escape for \). Estas sequencias so interpretadas como os ASCII 0 (um byte de valor zero) e NULL. Veja abaixo as regras no tratamento de NULL. Para maiores informaes sobre a sintaxe \-escape, veja Seco 6.1.1, Literais: Como Gravar Strings e Numerais. Em certos casos, as opes de tratamento de campoe e linhas se interagem: Se LINES TERMINATED BY uma string vazia e FIELDS TERMINATED BY no vazio, as linhas tambm sero terminadas com FIELDS TERMINATED BY . Se os valores FIELDS TERMINATED BY e FIELDS ENCLOSED BY so ambos vazios ( ''), um formato de linha de tamanhos fixos (sem delimitadores) utilizada. Com formato de linhas de tamanho fixo, nenhum deliitador usado entre os campos (mas voc ainda pode ter um terminador de linha). Valores de colunas so escritos e lidos usando o tamanho definido das colunas. Por exemplo, se uma coluna declarada como INT(7), os valores das colunas so escritos utilizando campos de 7 caracteres. Na sada, os valores das colunas so obtidos lendo 7 caracteres.
LINES TERMINATED BY ainda usado para separar linhas. Se uma linha no contm todos os campos, o resto

dos campos sero configurados com o seu valor padro. Se voc no tiver um terminador de linha, voc deve defini-lo com '' . Neste caso o arquivo texto deve conter todos os campos para cada linha. O formato de linhas de tamanho fixo tambm afetam o tratamento de valores NULL; veja abixo. Note que este formato no funciona se voc estiver utilizando um conjunto de caracteres mulyi-byte. O tratamento do valor NULL varia, dependendo das opes de FIELDS e LINES que voce usar: Para os valores FIELDS e LINES padres, NULL escrito como \N para sada e \N lido como NULL para as entradas (assumindo que o caracter ESCAPED BY \). Se FIELDS ENCLOSED BY no for vazio, um campo contendo a palavra literal NULL como seu valor lido como um valor NULL (isto difere da palavra NULL entre os caracteres FIELDS ENCLOSED BY, a qual lida como a string'NULL' ). Se FIELDS ESCAPED BY for vazio, NULL escrito como a palavra NULL. Com os formatos de tamanho fixos (que acontecem quando FIELDS TERMINATED BY e FIELDS ENCLOSED
BYestiverem ambos vazios), NULL escrito como uma string vazia. Note que isto faz com que os valores NULL e

uma string vazia na tabela sero indistingveis quando escritas no arquivo pois elas so ambas escritas como strings vazias. Se voc precisar estar saber diferenciar as duas ao ler o arquivo de volta, voc no deve utilizar o formato de tamanho fixo. Alguns casos no so suportados por LOAD DATA INFILE : Linhas de tamanho fixo ( FIELDS TERMINATED BY e FIELDS ENCLOSED BY vazios) e colunas BLOB ou TEXT. Se voc especificar um separador que igual ao prefixo do outro, LOAD DATA INFILE no poder interpretar a entratada apropriadamente. Por exemplo, a seguinte clusula FIELDS causaria problemas:
FIELDS TERMINATED BY '"' ENCLOSED BY '"'

Se FIELDS ESCAPED BY estiver vazio, um valor de campo que contm uma ocorrncia de FIELDS ENCLOSED
BYou LINES TERMINATED BY seguido por valores FIELDS TERMINATED BY far com que LOAD DATA INFILE pare de ler um campo ou linha antes do esperado. Isto ocorre porque LOAD DATA INFILE no pode

determinar apropriadamente onde o valor de campo ou linha acaba. A oseguinte exemplo carrega todas as colunas da tablea persondata :
mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;

Nenhuma lista de campo especificada, assim LOAD DATA INFILE espera linhas de entradas que contenha um campo para cada coluna da tabela. Os valores padres de FIELDS e LINES so usados. Se voc deseja carregar somente algumas das colunas das tabelas, especifique uma lista de campos:
mysql> LOAD DATA INFILE 'persondata.txt' ->
INTO TABLE persondata (col1,col2,...);

Voc deve especificar uma lista de campos se a ordem dos campos no arquivo de entrada diferem da ordem das colunas na tabela. Seno o MySQL no poder dizer como combinar os campos da entrada nas colunas da tabela. Se uma linha tiver poucos campos, as colunas para os quais o campo de entrada no estiverem presentes sero definidas com o valor padro. Atribuio de valor padro descrito em Seco 6.5.3, Sintaxe CREATE TABLE .

Um valor de campo vazio interpretado de forma diferente de que se o valor do campo estiiver faltando: Para tipos string, a coluna definida com uma string vazia. Para tipos numricos, a coluna definida com 0. Para tipos de data e hora, a coluna definida com o valor ``zero'' apropriado para o tipo. See Seco 6.2.2, Tipos de Data e Hora. Note que estes so os mesmos valores que resultam se voc atribuir uma string vazia explicitamente a um tipo string, numrico, de data ou de hora em uma instruo INSERT ou UPDATE . Colunas TIMESTAMP s so definidas com a hora e data atual se houver um valor NULL para a coluna (isto , \N), ou (apenas para a primeira coluna TIMESTAMP ) se a coluna TIMESTAMP esta a esquerda da lista de campos quando esta for especificada. Se uma linha de entrada tiver muitos campos, os campos extras sero ignorados e o nmero de avisos incrementado. Note que antes do MySQL 4.1.1 o aviso apenas um nmero que indica que alguma coisa deu errado. No MySQL 4.1.1 voc pode fazer SHOW WARNINGS para obter mais informaes sobre o que deu errado.
LOAD DATA INFILE considera todas as entradas como strings, assim voc no pode utiliar valores numricos

para colunas ENUM ou SET do mesmo modo que voc pode com instrues INSERT . Todos os valores ENUM e SETdevem ser especficados como strings! Se voc estiver usando a API C, voc pode obter informaes sobre a consulta chamando a funo mysql_info() da API C quando a consulta LOAD DATA INFILE terminar. O formato da string de informao mostrado aqui:
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0

Avisos ocorrem sob as mesmas circuntncias que quando so inseridos via instruo INSERT (see Seco 6.4.3, Sintaxe INSERT), exceto que LOAD DATA INFILE tambm gera avisos quando houver poucos ou muitos campos na linha de entrada. Os avisos no so armazenados em nenhum local; o nmero de avisos s pode ser utilizado como uma indicao se tudo correr bem. Se voc obter avisos e quiser saber exatamente porque eles ocorreram, um modo de se fazer isto utilizar SELECT ... INTO OUTFILE em outro arquivo e campor-lo ao arquivo de entrada original. Se voc precisar que LOAD DATA leia de um pipe, voc pode utilizar o seguinte truque:
mkfifo /mysql/db/x/xchmod 666 /mysql/db/x/xcat < /dev/tcp/10.1.1.12/4711 > /nt/mysql/db/x/xmysql -e "LOAD DATA INFILE 'x' INTO TABLE x

Se voc estiver usando uma verso do MySQL a anterior a 3.23.25 voc s poder fazer o descrito acima comLOAD DATA LOCAL INFILE . No MySQL 4.1.1 voc pode usar SHOW WARNINGS para conseguir a lista do primeiros max_error_count avisos. See Seco 4.6.8.9, SHOW WARNINGS | ERRORS . Para mais informaes sobre a eficincia de INSERT versus LOAD DATA INFILE e a melhora na velocidade deLOAD DATA INFILE, See Seco 5.2.10, Performance das Consultas que Utilizam INSERT.