Spec-Zone .ru
спецификации, руководства, описания, API

13.2.6. LOAD DATA INFILEСинтаксис

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'    [REPLACE | IGNORE]    INTO TABLE tbl_name    [PARTITION (partition_name,...)]    [CHARACTER SET charset_name]    [{FIELDS | COLUMNS}        [TERMINATED BY 'string']        [[OPTIONALLY] ENCLOSED BY 'char']        [ESCAPED BY 'char']    ]    [LINES        [STARTING BY 'string']        [TERMINATED BY 'string']    ]    [IGNORE number {LINES | ROWS}]    [(col_name_or_user_var,...)]    [SET col_name = expr,...]

LOAD DATA INFILE оператор читает строки из текстового файла в таблицу в сверхвысокой скорости. LOAD DATA INFILE дополнение SELECT ... INTO OUTFILE. (См. Раздел 13.2.9.1,"SELECT ... INTO Синтаксис".), Чтобы записать данные от таблицы до файла, использовать SELECT ... INTO OUTFILE. Чтобы считать файл назад в таблицу, использовать LOAD DATA INFILE. Синтаксис FIELDS и LINES пункты являются тем же самым для обоих операторов. Оба пункта являются дополнительными, но FIELDS должен предшествовать LINES если оба определяются.

Можно также загрузить файлы данных при использовании mysqlimport утилиты; это работает, передаваясь a LOAD DATA INFILE оператор к серверу. --local опция заставляет mysqlimport читать файлы данных из хоста клиента. Можно определить --compress опция, чтобы получить лучшую производительность по медленным сетям, если поддержка клиента и сервера сжатый протокол. См. Раздел 4.5.5, "mysqlimport — Программа Импорта Данных".

Для получения дополнительной информации об эффективности INSERT против LOAD DATA INFILE и ускорение LOAD DATA INFILE, см. Раздел 8.2.2.1, "Скорость INSERT Операторы".

Имя файла должно быть дано как литеральная строка. На Windows определите наклонные черты влево в путях как наклонные черты вправо или удвоенные наклонные черты влево. character_set_filesystem системная переменная управляет интерпретацией имени файла.

В MySQL 5.6.2 и позже, LOAD DATA поддерживает явный выбор раздела, используя PARTITION опция со списком разделенных запятой значений больше или большим количеством имен разделов, подразделов, или обоих. Когда эта опция используется, если какие-либо строки от файла не могут быть вставлены ни в один из разделов или подразделов, названных в списке, сбоях оператора с ошибкой, Найденной строкой, не соответствующей данный набор раздела. Для получения дополнительной информации см. Раздел 18.5, "Выбор Раздела".

Для разделенных таблиц, используя механизмы хранения, которые используют блокировки таблицы, такой как MyISAM, LOAD DATA не может сократить блокировки раздела. Это не применяется к таблицам, используя механизмы хранения, которые используют блокировку на уровне строки, такой как InnoDB. Для получения дополнительной информации см. Раздел 18.6.4, "Деля и Блокируя".

Набор символов, обозначенный character_set_database системная переменная используется, чтобы интерпретировать информацию в файле. SET NAMES и установка character_set_client не влияйте на интерпретацию ввода. Если содержание входного файла использует набор символов, который отличается от значения по умолчанию, обычно предпочтительно определить набор символов файла при использовании CHARACTER SET пункт. Набор символов binary не определяет "преобразования."

LOAD DATA INFILE интерпретирует все поля в файле как наличие того же самого набора символов, независимо от типов данных столбцов, в которые загружаются значения полей. Для правильной интерпретации содержания файла следует гарантировать, что она была записана с корректным набором символов. Например, если Вы пишете файл данных с mysqldump-T или выходя a SELECT ... INTO OUTFILE оператор в mysql, убедиться, что использовал a --default-character-set опция так, чтобы выведенный был записан в наборе символов, который будет использоваться, когда файл загружается LOAD DATA INFILE.

Отметить

Не возможно загрузить файлы данных, которые используют ucs2, utf16, utf16le, или utf32 набор символов.

Если Вы используете LOW_PRIORITY, выполнение LOAD DATA оператор задерживается, пока никакие другие клиенты не читают из таблицы. Это влияет только на механизмы хранения, которые используют только блокировку на уровне таблицы (такой как MyISAM, MEMORY, и MERGE).

Если Вы определяете CONCURRENT с a MyISAM таблица, которая удовлетворяет условие для параллельных вставок (то есть, это не содержит свободных блоков в середине), другие потоки может получить данные от таблицы в то время как LOAD DATA выполняется. Эта опция влияет на производительность LOAD DATA немного, даже если никакой другой поток не использует таблицу одновременно.

С построчной репликацией, CONCURRENT тиражируется независимо от версии MySQL. С основанной на операторе репликацией CONCURRENT не тиражируется до MySQL 5.5.1 (см. Ошибку #34628). Для получения дополнительной информации см. Раздел 16.4.1.17, "Репликация и LOAD DATA INFILE".

LOCAL ключевое слово влияет на ожидаемое расположение файла и обработки ошибок, как описано позже. LOCAL работы, только если Ваш сервер и Ваш клиент оба были сконфигурированы, чтобы разрешить это. Например, если mysqld был запущен с --local-infile=0, LOCAL не работает. См. Раздел 6.1.6, "Вопросы безопасности с LOAD DATA LOCAL".

LOCAL ключевое слово влияет, где файл, как ожидают, будет найден:

В не -LOCAL случай, эти правила означают что файл, названный как ./myfile.txt читается из каталога данных сервера, тогда как файл, названный как myfile.txt читается из каталога базы данных базы данных значения по умолчанию. Например, если db1 база данных значения по умолчанию, следующий LOAD DATA оператор читает файл data.txt из каталога базы данных для db1, даже при том, что оператор явно загружает файл в таблицу в db2 база данных:

LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;

Для соображений безопасности, читая текстовые файлы, расположенные на сервере, файлы должны или находиться в каталоге базы данных или быть читаемыми всеми. Кроме того, чтобы использовать LOAD DATA INFILE на файлах сервера Вы должны иметь FILE полномочие. См. Раздел 6.2.1, "Полномочия, Обеспеченные MySQL". Для не -LOCAL операции загрузки, если secure_file_priv системная переменная устанавливается в непустое имя каталога, файл, который будет загружен, должен быть расположен в том каталоге.

Используя LOCAL немного медленнее чем разрешение серверу получить доступ к файлам непосредственно, потому что содержание файла должно быть отправлено по соединению клиентом к серверу. С другой стороны Вы не нуждаетесь FILE полномочие загрузить локальные файлы.

LOCAL также влияет на обработку ошибок:

REPLACE и IGNORE обработка управления ключевыми словами входных строк, которые копируют существующие строки на значениях уникального ключа:

Проигнорировать ограничения внешнего ключа во время работы загрузки, проблемы a SET foreign_key_checks = 0 оператор перед выполнением LOAD DATA.

Если Вы используете LOAD DATA INFILE на пустом MyISAM таблица, все групповые индексируют, создаются в отдельном пакете (что касается REPAIR TABLE). Обычно, это делает LOAD DATA INFILE намного быстрее, когда Вы имеете, многие индексируют. В некоторых крайних случаях можно создать индексирование еще быстрее, выключая их с ALTER TABLE ... DISABLE KEYS прежде, чем загрузить файл в таблицу и использование ALTER TABLE ... ENABLE KEYS воссоздать индексирование после загрузки файла. См. Раздел 8.2.2.1, "Скорость INSERT Операторы".

Для обоих LOAD DATA INFILE и SELECT ... INTO OUTFILE операторы, синтаксис FIELDS и LINES пункты являются тем же самым. Оба пункта являются дополнительными, но FIELDS должен предшествовать LINES если оба определяются.

Если Вы определяете a FIELDS пункт, каждый из его подпунктов (TERMINATED BY, [OPTIONALLY] ENCLOSED BY, и ESCAPED BY) является также дополнительным, за исключением того, что следует определить по крайней мере одного из них.

Если Вы определяете нет FIELDS или LINES пункт, значения по умолчанию являются тем же самым, как будто Вы записали это:

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'LINES TERMINATED BY '\n' STARTING BY ''

(Наклонная черта влево является символом ESC MySQL в пределах строк в SQL-операторах, так определить литеральную наклонную черту влево, следует определить две наклонных черты влево для значения, которое будет интерпретироваться как единственная наклонная черта влево. Escape-последовательности '\t' и '\n' определите вкладку и символы новой строки, соответственно.)

Другими словами, причина значений по умолчанию LOAD DATA INFILE действовать следующим образом когда ввод чтения:

Наоборот, причина значений по умолчанию SELECT ... INTO OUTFILE действовать следующим образом когда вывод записи:

Отметить

Если Вы генерировали текстовый файл на системе Windows, Вам, возможно, придется использовать LINES TERMINATED BY '\r\n' считать файл должным образом, потому что Windows-программы обычно используют два символа в качестве разделителя строки. Некоторые программы, такие как WordPad, могли бы использовать \r как разделитель строки при записи файлов. Чтобы считать такие файлы, использовать LINES TERMINATED BY '\r'.

Если у всех строк, в которых Вы хотите читать, есть общий префикс, который Вы хотите проигнорировать, можно использовать LINES STARTING BY 'prefix_string' перескакивать через префикс, и что-либо перед этим. Если строка не включает префикс, вся строка пропускается. Предположите, что Вы делаете следующее заявление:

LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test  FIELDS TERMINATED BY ','  LINES STARTING BY 'xxx';

Если файл данных похож на это:

xxx"abc",1something xxx"def",2"ghi",3

Получающиеся строки будут ("abc",1) и ("def",2). Третья строка в файле пропускается, потому что это не содержит префикс.

IGNORE number LINES опция может использоваться, чтобы проигнорировать строки в начале файла. Например, можно использовать IGNORE 1 LINES перескакивать через начальную строку заголовка, содержащую имена столбцов:

LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;

Когда Вы используете SELECT ... INTO OUTFILE в тандеме с LOAD DATA INFILE чтобы записать данные из базы данных в файл и затем считать файл назад в базу данных позже, поле - и обрабатывающие строку опции для обоих операторов должно соответствовать. Иначе, LOAD DATA INFILE не будет интерпретировать содержание файла должным образом. Предположите, что Вы используете SELECT ... INTO OUTFILE записать файл с полями, разграниченными запятыми:

SELECT * INTO OUTFILE 'data.txt'  FIELDS TERMINATED BY ','  FROM table2;

Чтобы считать файл разделенных запятыми значений въезжают задним ходом, корректный оператор был бы:

LOAD DATA INFILE 'data.txt' INTO TABLE table2  FIELDS TERMINATED BY ',';

Если бы вместо этого Вы попытались читать в файле с оператором, показанным после, то это не работало бы, потому что это сообщает LOAD DATA INFILE искать вкладки между полями:

LOAD DATA INFILE 'data.txt' INTO TABLE table2  FIELDS TERMINATED BY '\t';

Вероятный результат состоит в том, что каждая входная строка была бы интерпретирована как единственное поле.

LOAD DATA INFILE может использоваться, чтобы считать файлы, полученные из внешних источников. Например, много программ могут экспортировать данные в разделенных от запятой значениях (CSV) формат, так, что строкам разделили поля запятые и включенный в пределах двойных кавычек с начальной строкой имен столбцов. Если строки в таком файле завершаются возвратом каретки / пары новой строки, оператор, показанный здесь, иллюстрирует поле - и обрабатывающие строку опции, которые Вы использовали бы, чтобы загрузить файл:

LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name  FIELDS TERMINATED BY ',' ENCLOSED BY '"'  LINES TERMINATED BY '\r\n'  IGNORE 1 LINES;

Если входные значения не обязательно включаются в пределах кавычек, использовать OPTIONALLY перед ENCLOSED BY ключевые слова.

Любое поле - или обрабатывающие строку опции может определить пустую строку (''). Если не пустой, FIELDS [OPTIONALLY] ENCLOSED BY и FIELDS ESCAPED BY значения должны быть единственным символом. FIELDS TERMINATED BY, LINES STARTING BY, и LINES TERMINATED BY значения могут быть больше чем одним символом. Например, чтобы записать строки, которые завершаются возвратом каретки / пары перевода строки, или считать файл, содержащий такие строки, определяют a LINES TERMINATED BY '\r\n' пункт.

Считать файл, содержащий шутки, которые разделяются строками, состоящими из %%, можно сделать это

CREATE TABLE jokes  (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  joke TEXT NOT NULL);LOAD DATA INFILE '/tmp/jokes.txt' INTO TABLE jokes  FIELDS TERMINATED BY ''  LINES TERMINATED BY '\n%%\n' (joke);

FIELDS [OPTIONALLY] ENCLOSED BY заключение в кавычки средств управления полей. Для вывода (SELECT ... INTO OUTFILE), если Вы опускаете слово OPTIONALLY, все поля включаются ENCLOSED BY символ. Пример такого вывода (использующий запятую в качестве разделителя полей) показывают здесь:

"1","a string","100.20""2","a string containing a , comma","102.20""3","a string containing a \" quote","102.20""4","a string containing a \", quote and comma","102.20"

Если Вы определяете OPTIONALLY, ENCLOSED BY символ используется только, чтобы включить значения от столбцов, у которых есть строковый тип данных (такой как CHAR, BINARY, TEXT, или ENUM):

1,"a string",100.202,"a string containing a , comma",102.203,"a string containing a \" quote",102.204,"a string containing a \", quote and comma",102.20

Отметьте это возникновения ENCLOSED BY символа в пределах значения поля оставляют, снабжая префиксом их с ESCAPED BY символ. Также отметьте это, если Вы определяете пустое ESCAPED BY значение, возможно непреднамеренно генерировать вывод, который не может быть считан должным образом LOAD DATA INFILE. Например, предыдущий вывод, только показанный, появился бы следующим образом, если символ ESC пуст. Заметьте, что второе поле в четвертой строке содержит запятую после кавычки, которая (ошибочно), кажется, завершает поле:

1,"a string",100.202,"a string containing a , comma",102.203,"a string containing a " quote",102.204,"a string containing a ", quote and comma",102.20

Для ввода, ENCLOSED BY символ, если есть разделяется от концов значений полей. (Это - истина независимо от ли OPTIONALLY определяется; OPTIONALLY не имеет никакого эффекта на входную интерпретацию.) Возникновения ENCLOSED BY символ, которому предшествуют ESCAPED BY символ интерпретируется как часть текущего значения поля.

Если поле начинается ENCLOSED BY символ, экземпляры того символа распознаются как завершение значения поля только если сопровождаемый полем или строкой TERMINATED BY последовательность. Избегать неоднозначности, возникновений ENCLOSED BY символ в пределах значения поля может быть удвоен и интерпретируется как единственный экземпляр символа. Например, если ENCLOSED BY '"' определяется, кавычки обрабатываются как показано здесь:

"The ""BIG"" boss"  -> The "BIG" bossThe "BIG" boss      -> The "BIG" bossThe ""BIG"" boss    -> The ""BIG"" boss

FIELDS ESCAPED BY средства управления, как считать или записать специальные символы:

В определенных случаях взаимодействует поле - и обрабатывающие строку опции:

Обработка NULL значения изменяются согласно FIELDS и LINES опции в использовании:

Попытка загрузиться NULL в a NOT NULL столбец вызывает присвоение неявного значения по умолчанию для типа данных столбца и предупреждения, или ошибки в строгом режиме SQL. Неявные значения по умолчанию обсуждаются в Разделе 11.5, "Значения по умолчанию Типа данных".

Некоторые случаи не поддерживаются LOAD DATA INFILE:

Следующий пример загружает все столбцы persondata таблица:

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;

По умолчанию, когда никакой список столбцов не обеспечивается в конце LOAD DATA INFILE оператор, входные строки, как ожидают, будут содержать поле для каждого столбца таблицы. Если Вы хотите загрузить только некоторые из столбцов таблицы, определите список столбцов:

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);

Следует также определить список столбцов, если порядок полей во входном файле отличается от порядка столбцов в таблице. Иначе, MySQL не может сказать, как соответствовать поля ввода со столбцами таблицы.

Список столбцов может содержать или имена столбцов или пользовательские переменные. С пользовательскими переменными, SET пункт позволяет Вам выполнить преобразования на их значениях прежде, чем присвоить результат столбцам.

Пользовательские переменные в SET пункт может использоваться несколькими способами. Следующий пример использует первый входной столбец непосредственно для значения t1.column1, и присваивает второй входной столбец пользовательской переменной, которая подвергается операции деления прежде, чем быть используемым для значения t1.column2:

LOAD DATA INFILE 'file.txt'  INTO TABLE t1  (column1, @var1)  SET column2 = @var1/100;

SET пункт может использоваться, чтобы предоставить ставки, не сделанные на входной файл. Следующие наборы оператора column3 к текущей дате и время:

LOAD DATA INFILE 'file.txt'  INTO TABLE t1  (column1, column2)  SET column3 = CURRENT_TIMESTAMP;

Можно также отбросить входное значение, присваивая это пользовательской переменной и не присваивая переменную столбцу таблицы:

LOAD DATA INFILE 'file.txt'  INTO TABLE t1  (column1, @dummy, column2, @dummy, column3);

Использование списка столбца/переменной и SET пункт подвергается следующим ограничениям:

Обрабатывая входную строку, LOAD DATA разделения это в поля и использование значения согласно списку столбца/переменной и SET пункт, если они присутствуют. Затем получающаяся строка вставляется в таблицу. Если есть BEFORE INSERT или AFTER INSERT триггеры для таблицы, они активируются прежде или после вставки строки, соответственно.

Если у входной строки есть слишком много полей, дополнительные поля игнорируются, и число предупреждений постепенно увеличивается.

Если у входной строки есть слишком немного полей, столбцы таблицы, для которых отсутствуют поля ввода, устанавливаются в их значения по умолчанию. Присвоение значения по умолчанию описывается в Разделе 11.5, "Значения по умолчанию Типа данных".

Пустое значение поля интерпретируется отличающееся от недостающего поля:

Они - те же самые значения, которые заканчиваются, если Вы присваиваете пустую строку явно строке, числовой, или дата или тип времени явно в INSERT или UPDATE оператор.

Обработка пустых или неправильных значений полей отличается от тот только описанный, если режим SQL устанавливается в рестриктивное значение. Например, если sql_mode='TRADITIONAL, преобразование пустого значения или значения такой как 'x' поскольку числовой столбец приводит к ошибке, не преобразованию в 0. (С LOCAL, предупреждения происходят, а не ошибки, даже с рестриктивным sql_mode значение, потому что у сервера нет никакого способа остановить передачу файла в середине работы.)

TIMESTAMP столбцы устанавливаются в текущую дату и время, только если есть a NULL значение для столбца (то есть, \N) и столбец, как объявляют, не разрешает NULL значения, или если TIMESTAMP значение по умолчанию столбца является текущей меткой времени, и это опускается из cписка полей, когда cписок полей определяется.

LOAD DATA INFILE отношения весь ввод как строки, таким образом, невозможно использовать числовые значения для ENUM или SET столбцы путем Вы можете с INSERT операторы. Все ENUM и SET значения должны быть определены как строки.

BIT значения не могут быть загружены, используя двоичную запись (например, b'011010'). Чтобы работать вокруг этого, определите значения как регулярные целые числа и используйте SET пункт, чтобы преобразовать их так, чтобы MySQL выполнил числовое преобразование типов и загрузил их в BIT столбец должным образом:

shell> cat /tmp/bit_test.txt2127shell> mysql testmysql> LOAD DATA INFILE
        '/tmp/bit_test.txt'    -> INTO TABLE bit_test (@var1) SET b =
        CAST(@var1 AS UNSIGNED);Query OK, 2 rows affected (0.00 sec)Records: 2  Deleted: 0  Skipped: 0  Warnings: 0mysql> SELECT BIN(b+0) FROM bit_test;+----------+| bin(b+0) |+----------+| 10       || 1111111  |+----------+2 rows in set (0.00 sec)

На Unix, если Вы нуждаетесь LOAD DATA чтобы читать из канала, можно использовать следующий метод (пример загружает перечисление / каталог в таблицу db1.t1):

mkfifo /mysql/data/db1/ls.datchmod 666 /mysql/data/db1/ls.datfind / -ls > /mysql/data/db1/ls.dat &mysql -e "LOAD DATA INFILE 'ls.dat' INTO TABLE t1" db1

Отметьте, что следует выполнить команду, которая генерирует данные, которые будут загружены и mysql команды или на отдельных терминалах, или выполняет процесс генерации данных в фоновом режиме (как показано в предыдущем примере). Если Вы не сделаете этого, то канал блокирует, пока данные не читаются процессом mysql.

Когда LOAD DATA INFILE концы оператора, это возвращает информационную строку в следующем формате:

Records: 1  Deleted: 0  Skipped: 0  Warnings: 0

Предупреждения происходят при тех же самых обстоятельствах как тогда, когда значения вставляются, используя INSERT оператор (см. Раздел 13.2.5,"INSERT Синтаксис"), за исключением того, что LOAD DATA INFILE также генерирует предупреждения, когда есть слишком немногие или слишком много полей во входной строке.

Можно использовать SHOW WARNINGS получить список первого max_error_count предупреждения как информация о том, что пошло не так, как надо. См. Раздел 13.7.5.41,"SHOW WARNINGS Синтаксис".

Если Вы используете API C, можно получить информацию об операторе, вызывая mysql_info() функция. См. Раздел 22.8.7.35,"mysql_info()".