Spec-Zone .ru
спецификации, руководства, описания, API
|
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name
' [REPLACE | IGNORE] INTO TABLEtbl_name
[PARTITION (partition_name
,...)] [CHARACTER SETcharset_name
] [{FIELDS | COLUMNS} [TERMINATED BY 'string
'] [[OPTIONALLY] ENCLOSED BY 'char
'] [ESCAPED BY 'char
'] ] [LINES [STARTING BY 'string
'] [TERMINATED BY 'string
'] ] [IGNOREnumber
{LINES | ROWS}] [(col_name_or_user_var
,...)] [SETcol_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
определяется, файл читается клиентской
программой на хосте клиента и отправляется серверу. Файл может быть дан как имя полного пути, чтобы
определить его точное расположение. Если дано как относительный путь, имя интерпретируется относительно
каталога, в котором была запущена клиентская программа.
При использовании LOCAL
с LOAD DATA
, копия файла создается во временном каталоге сервера. Это
не каталог, определенный значением tmpdir
или slave_load_tmpdir
, а скорее временный каталог операционной
системы, и не конфигурируем в MySQL Server. (Обычно система временный каталог /tmp
на системах Linux и C:\WINDOWS\TEMP
на Windows.) Нехватка достаточного пространства для
копии в этом каталоге может вызвать 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
также влияет на обработку ошибок:
С LOAD DATA
INFILE
, интерпретация данных и двойные ключевые ошибки завершают работу.
С LOAD DATA LOCAL
INFILE
, интерпретация данных и двойные ключевые ошибки становятся предупреждениями, и работа
продолжается, потому что у сервера нет никакого способа остановить передачу файла в середине работы. Для
двойных ключевых ошибок это - то же самое как будто IGNORE
определяется.
IGNORE
объясняется дальнейший позже в этом разделе.
REPLACE
и IGNORE
обработка управления ключевыми словами
входных строк, которые копируют существующие строки на значениях уникального ключа:
Если Вы определяете REPLACE
, входные строки заменяют
существующие строки. Другими словами, строки, у которых есть то же самое значение для первичного ключа
или уникального индекса как существующая строка. См. Раздел 13.2.8,"REPLACE
Синтаксис".
Если Вы определяете IGNORE
, пропускаются входные
строки, которые копируют существующую строку на значении уникального ключа.
Если Вы не определяете ни одну опцию, поведение зависит от ли LOCAL
ключевое слово определяется. Без LOCAL
,
ошибка происходит, когда двойное значение ключа находится, и остальная часть текстового файла
игнорируется. С LOCAL
, поведение значения по умолчанию является тем же
самым как будто 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
действовать следующим образом когда ввод чтения:
Ищите границы строки в новых строках.
Не перескакивайте ни через какой префикс строки.
Строки повреждения в поля во вкладках.
Не ожидайте, что поля будут включены в пределах любых символов заключения в кавычки.
Интерпретируйте символы, которым предшествует символ ESC"\
"как
escape-последовательности. Например,"\t
",
"\n
",
и"\\
"покажите
вкладку, новую строку, и наклонную черту влево, соответственно. См. обсуждение FIELDS
ESCAPED BY
позже для полного списка escape-последовательностей.
Наоборот, причина значений по умолчанию 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
LINESIGNORE
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
средства управления, как считать или записать специальные символы:
Для ввода, если FIELDS ESCAPED BY
символ не пуст,
возникновения того символа разделяются, и следующий символ берется буквально в качестве части значения
поля. Некоторые двухсимвольные последовательности, которые являются исключениями, где первый символ
является символом ESC. Эти последовательности показывают в следующей таблице (использование"\
"для
символа ESC). Правила для NULL
обработка описывается позже в этом разделе.
Символ | Escape-последовательность |
---|---|
\0
|
ASCII NUL (0x00 ) символ |
\b
|
Символ возврата |
\n
|
Новая строка (перевод строки) символ |
\r
|
Символ возврата каретки |
\t
|
Символ вкладки. |
\Z
|
ASCII 26 (Control+Z) |
\N
|
НУЛЬ |
Для получения дополнительной информации о"\
"-синтаксис Escape, см. Раздел
9.1.1, "Строковые литералы".
Если FIELDS ESCAPED BY
символ пуст интерпретация
escape-последовательности не происходит.
Для вывода, если FIELDS ESCAPED BY
символ не пуст, он
используется, чтобы снабдить префиксом следующие символы на выводе:
FIELDS ESCAPED BY
символ
FIELDS [OPTIONALLY] ENCLOSED BY
символ
Первый символ FIELDS TERMINATED BY
и LINES TERMINATED BY
значения
ASCII 0
(что фактически пишется после
символа ESC, ASCII"0
", не оцененный нулю байт)
Если FIELDS ESCAPED BY
символ пуст, никаких символов не оставляют и
NULL
выводится как NULL
, нет \N
. Это - вероятно, не хорошая идея определить пустой символ ESC,
особенно если значения полей в Ваших данных содержат какой-либо из символов в списке, только данном.
В определенных случаях взаимодействует поле - и обрабатывающие строку опции:
Если LINES TERMINATED BY
пустая строка и FIELDS TERMINATED BY
непусто, строки также завершаются с FIELDS TERMINATED BY
.
Если FIELDS TERMINATED BY
и FIELDS
ENCLOSED BY
значения оба пусты (''
), фиксированная строка
(неразграниченный) формат используется. С форматом фиксированной строки никакие разделители не
используются между полями (но у Вас может все еще быть разделитель строки). Вместо этого значения
столбцов читаются и пишутся, используя поле width, достаточно широкое, чтобы содержать все значения в
поле. Для TINYINT
, SMALLINT
, MEDIUMINT
, INT
, и BIGINT
, ширина поля 4, 6, 8, 11, и 20, соответственно, независимо от
того каков объявленный дисплей width.
LINES TERMINATED BY
все еще используется, чтобы разделить строки. Если
строка не содержит все поля, остальная часть столбцов устанавливаются в их значения по умолчанию.
Если у Вас нет разделителя строки, следует установить это в ''
. В этом
случае текстовый файл должен содержать все поля для каждой строки.
Формат фиксированной строки также влияет на обработку NULL
значения,
как описано позже. Отметьте, что формат фиксированного размера не работает, если Вы используете
многобайтовый набор символов.
Обработка NULL
значения изменяются согласно FIELDS
и
LINES
опции в использовании:
Для значения по умолчанию FIELDS
и LINES
значения, NULL
пишется как значение поля
\N
для вывода, и значения поля \N
читается как
NULL
для ввода (предполагающий, что ESCAPED BY
символ"\
").
Если FIELDS ENCLOSED BY
не пусто, поле, содержащее
литеральное слово NULL
поскольку его значение читается как a NULL
значение. Это отличается от слова NULL
включенный в пределах FIELDS ENCLOSED BY
символы, который читается как
строка 'NULL'
.
Если FIELDS ESCAPED BY
пусто, NULL
пишется как слово NULL
.
С форматом фиксированной строки (который используется когда FIELDS
TERMINATED BY
и FIELDS ENCLOSED BY
оба пусты), NULL
пишется как пустая строка. Отметьте, что это вызывает обоих NULL
значения и пустые строки в таблице, чтобы быть неразличимым когда
записано в файл, потому что оба пишутся как пустые строки. Если Вы должны быть в состоянии сказать два
обособленно, когда чтение файла въезжает задним ходом, недопустимо использовать формат фиксированной
строки.
Попытка загрузиться NULL
в a NOT NULL
столбец вызывает
присвоение неявного значения по умолчанию для типа данных столбца и предупреждения, или ошибки в строгом режиме
SQL. Неявные значения по умолчанию обсуждаются в Разделе 11.5, "Значения
по умолчанию Типа данных".
Некоторые случаи не поддерживаются LOAD DATA
INFILE
:
Строки фиксированного размера (FIELDS TERMINATED BY
и
FIELDS ENCLOSED BY
оба пустеют), и BLOB
или TEXT
столбцы.
Если Вы определяете один разделитель, который является тем же самым как или префикс
другого, LOAD DATA INFILE
не может интерпретировать ввод должным образом.
Например, следующий FIELDS
пункт вызвал бы проблемы:
FIELDS TERMINATED BY '"' ENCLOSED BY '"'
Если FIELDS ESCAPED BY
пусто, значение поля, которое
содержит возникновение FIELDS ENCLOSED BY
или LINES
TERMINATED BY
сопровождаемый FIELDS TERMINATED BY
причины
значения LOAD DATA INFILE
прекратить читать поле или строку слишком рано. Это
происходит потому что 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
пункт подвергается следующим
ограничениям:
Присвоения в SET
у пункта должны быть только имена
столбцов на левой стороне операторов присваивания.
Можно использовать подзапросы в правой стороне SET
присвоения. Подзапрос, который возвращает значение, которое будет присвоено столбцу, может быть
скалярным подзапросом только. Кроме того, невозможно использовать подзапрос, чтобы выбрать из таблицы,
которая загружается.
Строки, проигнорированные IGNORE
пункт не
обрабатывается для списка столбца/переменной или SET
пункт.
Пользовательские переменные не могут использоваться, загружая данные с форматом фиксированной строки, потому что у пользовательских переменных нет дисплея width.
Обрабатывая входную строку, LOAD
DATA
разделения это в поля и использование значения согласно списку столбца/переменной и SET
пункт, если они присутствуют. Затем получающаяся строка вставляется в таблицу.
Если есть BEFORE INSERT
или AFTER INSERT
триггеры для
таблицы, они активируются прежде или после вставки строки, соответственно.
Если у входной строки есть слишком много полей, дополнительные поля игнорируются, и число предупреждений постепенно увеличивается.
Если у входной строки есть слишком немного полей, столбцы таблицы, для которых отсутствуют поля ввода, устанавливаются в их значения по умолчанию. Присвоение значения по умолчанию описывается в Разделе 11.5, "Значения по умолчанию Типа данных".
Пустое значение поля интерпретируется отличающееся от недостающего поля:
Для строковых типов столбец устанавливается в пустую строку.
Для числовых типов столбец устанавливается в 0
.
Для даты и типов времени, столбец устанавливается в соответствующее "нулевое" значение для типа. См. Раздел 11.3, "Дата и Типы Времени".
Они - те же самые значения, которые заканчиваются, если Вы присваиваете пустую строку явно строке, числовой, или
дата или тип времени явно в 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.txt
2127shell>mysql test
mysql>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()
".