Синтаксис LOAD DATA INFILE
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'имя_файла.txt' [REPLACE | IGNORE] INTO TABLE имя_таблицы[FIELDS [TERMINATED BY 't'] [[OPTIONALLY] ENCLOSED BY "] [ESCAPED BY f\f] ] [LINES [STARTING BY M] [TERMINATED BY fn f ] ] [IGNORE количество LINES] [{имя_столбца,...)] Оператор LOAD DATA INFILE читает строки из текстового файла и загружает их в таблицу на очень высокой скорости. Вы
можете также загружать файлы данных с помощью утилиты mysql import. Она
работает, посылая на сервер оператор LOAD data INFILE. Опция —-local
заставляет утилиту mysqlimport читать файл данных с клиентского хоста.
Вы можете указать опцию —compress для повышения производительности в
медленных сетях, если клиент и сервер поддерживают сжатый протокол. Если
указано ключевое слово LOW_PRIORITY, выполнение оператора LOAD DATA
откладывается до тех пор, пока все остальные клиенты не завершат
чтение. Если указано ключевое слово CONCURRENT с таблицей MyISAM,
которая удовлетворяет условию параллельных вставок (то есть не имеет
свободных блоков в середине файла), то другие потоки смогут извлекать
данные из таблицы одновременно с выполнением LOAD DATA. Применение этой
опции немного сказывается на производительности LOAD DATA, даже если ни
один другой поток с этой таблицей не работает. Если указано ключевое слово LOCAL, оно касается клиентской части соединения.
- Если слово LOCAL указано, файл читается клиентской программой на хосте клиента и отправляется на сервер.
- Если слово LOCAL не указано, загружаемый файл должен находиться на хосте сервера, и читается сервером непосредственно.
LOCAL доступно в MySQL 3.22.6 и более поздних версиях. Из
соображений безопасности при чтении текстовых файлов, расположенных на
сервере, файлы должны либо находиться в каталоге данных, либо быть
доступными всем по чтению. Кроме того, чтобы использовать LOAD DATA с
серверными файлами, вы должны иметь привилегию FILE. Загрузка с
опцией LOCAL идет несколько медленнее, чем когда вы даете серверу
возможность непосредственного доступа к загружаемым файлам, потому что в
этом случае содержимое файлов передается по сети через клиент-сер
верное соединение. С другой стороны, в этом случае вам не нужны
привилегии FILE. Начиная с версий MySQL 3.23.49 и MySQL 4.0.2 (4.0.13
для Windows), LOCAL работает, только если и клиент, и сервер разрешают
это. Например, если mysqld запущен с опцией —local-inf ile=0, то LOCAL
работать не будет.
Если вам нужно с помощью LOAD DATA читать из программного канала, вы можете применить следующую технику: mkfifo /mysql/db/x/x chmod 666 /mysql/db/x/x cat < /dev/tcp/10.1.1.12/4711 > /mysql/db/x/x mysql -e "LOAD DATA INFILE 'x1 INTO TABLE x" x Если вы работаете с версией MySQL, предшествующей 3.23.25, то эту технику можно применять только с LOAD DATA LOCAL INFILE. Если
у вас версия MySQL, предшествующая 3.23.24, то вы не сможете читать с
помощью оператора LOAD DATA INFILE из FIFO. Если вам нужно читать из
FIFO (например, из выходного потока gunzip), применяйте вместо этого
LOAD DATA LOCAL INFILE. При поиске файла в своей файловой системе сервер руководствуется следующими правилами:
- Если задан абсолютный путь, сервер его использует, как есть.
- Если задан относительный путь с одним или более ведущими компонентами, сервер ищет файлы относительно своего каталога данных.
- Если задано имя файла без ведущих компонентов пути, сервер ищет файл в каталоге данных базы данных по умолчанию.
Отметим, что из этих правил следует, что файл с именем ./myfile.txt
читается из каталога данных сервера, в то время как файл с именем
myfile,txt читается из каталога данных базы данных по умолчанию.
Например, следующий оператор LOAD DATA INFILE читает файл data.txt из
каталога данных базы dbl, потому что dbl -текущая база данных, несмотря
на то, что оператор загружает данные в базу данных db2: mysql> USE dbl; mysql> LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table; Ключевые
слова REPLACE и IGNORE управляют работой с входными строками, которые
дублируют существующие по значению уникальных ключей. Если указано
REPLACE, входные строки заменяют существующие строки (другими словами,
строки, которые имеют те же значения первичных или уникальных ключей,
как и существующие в таблице строки). См. раздел Синтаксис REPLACE Если
указано IGNORE, то входные строки, которые дублируют существующие
строки с теми же значениями первичных или уникальных ключей,
пропускаются. Если не указана ни одна, ни другая опции, то поведение
зависит от того, указано ли ключевое слово local. При отсутствии LOCAL, в
случае обнаружения дублирования ключа генерируется ошибка, а остаток
текстового файла игнорируется. При наличии LOCAL, поведение по умолчанию
будет таким же, как если бы было указано IGNORE. Это объясняется тем,
что сервер не в состоянии остановить передачу файла в процессе
выполнения этой операции. Если вы хотите игнорировать ограничения
внешних ключей в процессе операции загрузки данных, вы можете выполнить
оператор SET FOREIGN_KEY_CHECKS=0 перед запуском LOAD DATA. Если вы
запускаете LOAD DATA для пустой таблицы MyISAM, все неуникальные
индексы создаются в отдельном задании (как для REPAIR TABLE). Обычно
это приводит к тому, что при наличии многих индексов LOAD DATA
выполняется гораздо быстрее. Как правило, это работает очень быстро, но в
некоторых особых случаях вы можете создать индексы даже еще быстрее,
выключив их через ALTER TABLE.. .DISABLE KEYS перед загрузкой файла в таблицу, пересоздав индексы и включив их с помощью ALTER TABLE.. .ENABLE KEYS после окончания загрузки. LOAD
DATA INFILE - это дополнение для SELECT.. .INTO OUTFILE. См. раздел
Синтаксис SELECT Для записи данных из таблицы в файл пользуйтесь
SELECT... INTO OUTFILE. Чтобы прочитать данные обратно из файла в
таблицу, воспользуйтесь LOAD DATA INFILE. Синтаксис конструкций FIELDS и
LINES одинаков для обоих операторов. Обе эти конструкции не
обязательны, но fields должна предшествовать LINES, если указаны обе. Если
указана конструкция FIELDS, то все ее параметры (TERMINATED BY,
[OPTIONALLY] ENCLOSED BY и ESCAPED BY) также не обязательны, за
исключением требования, что обязательно должен присутствовать хотя бы
один параметр. Если конструкция FIELDS не указана, по умолчанию принимается следующий вид: FIELDS TERMINATED BY 'tf ENCLOSED BY " ESCAPED BY ' Если не указана конструкция LINES, по умолчанию принимается такой вариант: LINES TERMINATED BY 'n! STARTING BY " Другими словами, поведение по умолчанию LOAD DATA INFILE при чтении ввода таково:
- Искать разделители строк в начале строк.
- Не пропускать никаких префиксов строки.
- Разбивать строку на поля по знакам табуляции.
- Не ожидать, что поля будут заключены в кавычки.
- Интерпретировать появление знака табуляции, перевода строки или
символа '\ которым предшествует с\ как литеральные символы, являющиеся
частью значения поля.
И наоборот, SELECT... INTO OUTFILE по умолчанию ведет себя следующим образом:
- Пишет знаки табуляции между полями.
- Не окружает значения полей кавычками.
- Использует *' для выделения знаков табуляции, перевода строк или '\ встречающихся внутри значений полей.
- Пишет символ перевода строки в конце строк.
Следует
отметить, что для написания FIELDS ESCAPED BY 'W потребуется указать
два знака обратной косой черты для значений, в которых нужно читать одну
обратную косую черту. На заметку! Если вы
сгенерировали текстовый файл в системе Windows, возможно, вам
понадобится задать LINES TERMINATED BY 'rn чтобы правильно прочитать
файл, поскольку программы Windows обычно используют эти два символа в
качестве разделителя строк. Некоторые программы, подобные WordPad, при
записи файлов могут использовать символ 'г' в качестве разделителя
строк. Чтобы читать такие файлы, используйте LINES TERMINATED BY 'r'. Если все строки читаемого файла имеют общий префикс, который вы хотите игнорировать, используйте LINES STARTING BY ' строка_префиксах для того, чтобы пропускать этот префикс. Если строка не содержит префикса, она пропускается вся целиком.
Опция IGNORE количество LINES служит для игнорирования
заданного количества строк в начале файла. Например, вы можете
воспользоваться IGNORE I LINES, чтобы пропустить начальную строку,
содержащую имена столбцов: mysql> LOAD DATA INFILE '/tmp/test.txt' -> INTO TABLE test IGNORE 1 LINES; Когда
вы применяете SELECT... INTO OUTFILE в связке с LOAD DATA INFILE для
записи данных из базы в файл и последующего его чтения и загрузки
обратно в базу, опции управления строками и полями для обоих операторов
должны совпадать. В противном случае LOAD DATA INFILE не сможет
правильно интерпретировать содержимое текстового файла. Предположим,
что вы с помощью SELECT.. .INTO OUTFILE вывели данные в текстовый файл,
разделяя поля запятыми: mysql> SELECT * INTO OUTFILE 'data.txt' -> FIELDS TERMINATED BY',' -> FROM table2; Чтобы прочитать разделенный запятыми файл обратно, правильно будет поступить так: mysql> LOAD DATA INFILE 'data.txt1 INTO TABLE table2 -> FIELDS TERMINATED BY Если
вместо этого вы попытаетесь прочитать его оператором, приведенным ниже,
это не сработает, потому что LOAD DATA INFILE будет искать символы
табуляции между значениями полей: mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2 -> FIELDS TERMINATED BY 't'; Наиболее вероятным результатом будет интерпретация входной строки как единственного поля. LOAD
DATA INFILE также может использоваться для чтения файлов из внешних
источников. Например, некоторый файл может иметь поля, разделенные
запятыми и заключенные в двойные кавычки. Если строки в файле разделены
символом новой строки, приведенный ниже пример иллюстрирует, какие
должны быть установлены опции разделителей строк и столбцов для
загрузки файла: mysql> LOAD DATA INFILE 'data.txt' INTO TABLE имя_таблицы-> FIELDS TERMINATED BY 1,1 ENCLOSED BY "" -> LINES TERMINATED BY 'n'; Любым
опциям, задающим ограничители строк и столбцов, можно указывать в
качестве аргументов пустые строки ("). Если же аргументы - не пустые
строки, то значения ДЛЯ FIELDS [OPTIONALLY] ENCLOSED BY И FIELDS ESCAPED
BY ДОЛЖНЫ быть ОДНОСИМВОЛЬНЫМИ. Аргументы ОПЦИЙ FIELDS TERMINATED BY,
LINES STARTING BY И LINES TERMINATED BY могут иметь длину более одного
символа. Например, чтобы писать строки, разделенные символами возврат
каретки/перевод строки, либо чтобы читать файлы, содержащие такие
строки, указывайте конструкцию LINES TERMINATED BY 'rn'. Чтобы прочитать файл, разделенный по строкам символами %%, можно поступить следующим образом: mysql> CREATE TABLE jokes -> (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> joke TEXT NOT NULL);
mysql> LOAD DATA INFILE '/tmp/jokes,txf INTO TABLE jokes -> FIELDS TERMINATED BY '' -> LINES TERMINATED BY '\n%%\n' (joke); FIELDS
[OPTIONALLY] ENCLOSED BY управляет ограничителями (кавычками) полей.
При выводе (SELECT... INTO OUTFILE), если пропустить слово OPTIONALLY,
все поля будут окружены символом, указанным в ENCLOSED BY. Пример
такого вывода (с использованием запятой в качестве разделителя полей)
показан ниже: "1","а string","100.20" "2","a string containing a , comma","102.20" "3","а string containing a \" quote","102.20" "4","a string containing a \", quote and comma","102.20" Если вы указываете OPTIONALLY, то символ ENCLOSED BY применяется только для заключения в кавычки полей типа CHAR и VARCHAR: 1,"а string",100.20 2,"a string containing a , comma",102.20 3,"а string containing a \" quote",102.20 4,"a string containing a \", quote and comma",102.20 Обратите
внимание, что вхождения символа, указанного в ENCLOSED BY, внутри
значения поля предваряется символом, заданным в ESCAPED BY. Кроме того,
если указать пустое значение для ESCAPED BY, возможно, что будет
сгенерирован файл, который LOAD DATA INFILE не сумеет правильно
загрузить. Например, если символ отмены оставить пустым, приведенный
выше вывод будет выглядеть так, как показано ниже. Несложно заметить,
что второе поле в четвертой строке содержит запятую, следующую за
кавычкой, которая (ошибочно) будет выглядеть как разделитель полей. 1,"а string",100.20 2,"a string containing a , comma",102.20 3,"а string containing a " quote",102.20 4,"a string containing a ", quote and comma",102.20 При
вводе символ ENCLOSED BY, если он есть, удаляется из конца значения
полей. (Это верно вне зависимости от того, указано или нет слово
OPTIONALLY. Данное слово не имеет никакого эффекта при интерпретации
ввода.) Появление символов ENCLOSED BY с предшествующим символом
ESCAPED BY интерпретируется как часть текущего значения поля. Если
поле начинается с символа ENCLOSED BY, экземпляры этого символа
интерпретируются как завершение значения поля, только если за ними
следует поле или последовательность TERMINATED BY. Чтобы избежать
неоднозначности при появлении символа ENCLOSED BY внутри значения поля,
этот символ может быть продублирован, и будет интерпретироваться как
единственный экземпляр символа. Например, если задается ENCLOSED BY "",
кавычки обрабатываются следующим образом: "The ""BIG"" boss" -> The "BIG" boss The "BIG" boss -> The "BIG" boss The ""BIG"" boss -> The ""BIG"" boss FIELDS
ESCAPED BY управляет чтением или записью специальных символов. Если
аргумент FIELDS ESCAPED BY не пустой, он используется в качестве
префикса для следующих символов в выводе:
- Символа FIELDS ESCAPED BY.
- Символа FIELDS [OPTIONALLY] ENCLOSED BY.
- Первого СИМВОЛа последовательностей FIELDS TERMINATED BY И LINES TERMINATED BY.
- ASCII 0 (который пишется вслед за символом отмены как ASCII '0', а не нулевой байт).
Если символ FIELDS ESCAPED BY пуст, никакие символы не предваряются
символами отмены, и NULL выводится как NULL, а не \N. Вероятно, это не
очень хорошая мысль -оставлять пустым аргумент FIELDS ESCAPED BY,
особенно, если значения полей ваших данных содержат любой из упомянутых
символов. При вводе, если FIELDS ESCAPED BY не пуст, то при появлении
этого символа в строке значения он удаляется, а следующий за ним символ
читается литерально, как часть значения поля. Исключениями являются
последовательности '0' или 'N' (SYS-PAGE-CONTENT или \N, если символом
отмены выбран '\'). Эти последовательности интерпретируются,
соответственно, как ASCII NUL (нулевой байт) и NULL. Правила обращения с
NULL описаны ниже в настоящем разделе. Более подробную информацию о синтаксисе отмены '\' можно найти в разделе Литеральные значения В некоторых случаях опции, управляющие полями и строками, взаимодействуют между собой:
- Если указана пустая строка для LINES TERMINATED BY, a FIELDS
TERMINATED BY непуст, то разделителем строк также служит LINES
TERMINATED BY.
- ЕСЛИ пусты И FIELDS TERMINATED BY И FIELDS ENCLOSED BY,
ИСПОЛЬЗуется формат фиксированной строки (без разделителей). В этом
формате не применяется никаких разделителей между полями (но можно иметь
разделитель строк). Вместо этого значения столбцов пишутся и читаются с
использованием ширины отображения столбцов. Например, если столбец
объявлен как INT (7), значения столбца записываются в семисимвольное
поле. При вводе значения столбца извлекаются чтением семи символов.
LINES TERMINATED BY по-прежнему используется для разделения строк.
Если строка не содержит всех полей, остальным столбцам присваиваются их
значения по умолчанию. Если у вас нет терминатора строки, его значение
нужно установить в 1'. В этом случае текстовый файл должен содержать все
поля в каждой строке. Формат с фиксированной длиной строки также
касается работы со значениями NULL, как описано ниже. Следует отметить,
что формат фиксированной длины не работает, если используется
многобайтный набор символов (например, Unicode). Обработка значений NULL варьируется в зависимости от применяемых опций FIELDS и LINES:
- При значениях FIELDS и LINES по умолчанию NULL пишется как значение
поля ввиде \N для вывода и это же значение \N читается как NULL при
вводе (предполагая, что символ ESCAPED BY установлен в '\')-
- Если FIELDS ENCLOSED BY не пустой, то поле, содержащее
литеральное слово NULL, читается как значение NULL. Это отличается от
случая, когда слово NULL ограничено символами FIELDS ENCLOSED BY, когда
значение читается, как строка'NULL'.
- Если FIELDS ESCAPED BY пустое, NULL пишется как слово NULL.
|