Spec-Zone .ru
спецификации, руководства, описания, API
|
LOAD XML [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name
' [REPLACE | IGNORE] INTO TABLE [db_name
.]tbl_name
[PARTITION (partition_name
,...)] [CHARACTER SETcharset_name
] [ROWS IDENTIFIED BY '<tagname
>'] [IGNOREnumber
{LINES | ROWS}] [(column_or_user_var
,...)] [SETcol_name
=expr
,...]
LOAD
XML
оператор читает данные из XML-файла в таблицу. file_name
должен быть дан как литеральная строка. tagname
в дополнительном ROWS IDENTIFIED
BY
пункт должен также быть дан как литеральная строка, и должен быть окружен угловыми скобками (<
и >
).
LOAD
XML
действия как дополнение выполнения mysql клиента в режиме вывода XML (то есть, запуская клиент с --xml
опция). Чтобы
записать данные от таблицы до XML-файла, используйте команду, такую как следующий от системной оболочки:
shell> mysql --xml -e 'SELECT * FROM mytable' >
file.xml
Чтобы считать файл назад в таблицу, использовать LOAD
XML INFILE
. По умолчанию, <row>
элемент, как полагают, является
эквивалентом строки таблицы базы данных; это может быть изменено, используя ROWS
IDENTIFIED BY
пункт.
Этот оператор поддерживает три различных формата XML:
Имена столбцов как атрибуты и значения столбцов как значения атрибута:
<row
column1
="value1
"column2
="value2
" .../>
Имена столбцов как теги и значения столбцов как контент этих тегов:
<row
> <column1
>value1
</column1
> <column2
>value2
</column2
></row
>
Имена столбцов name
атрибуты
<field>
теги, и значения являются содержанием этих тегов:
<row> <field name='column1
'>value1
</field> <field name='column2
'>value2
</field></row>
Это - формат, используемый другими инструментами MySQL, такими как mysqldump.
Все 3 формата могут использоваться в том же самом XML-файле; подпрограмма импорта автоматически обнаруживает формат для каждой строки и интерпретирует это правильно. Теги являются соответствующими основанный на теге или названии атрибута и имени столбца.
Следующие пункты работают по существу тот же самый путь к LOAD XML
поскольку они делают для LOAD DATA
:
LOW_PRIORITY
или CONCURRENT
LOCAL
REPLACE
или IGNORE
PARTITION
CHARACTER SET
(
column_or_user_var
,...)
SET
См. Раздел 13.2.6,"LOAD DATA INFILE
Синтаксис", для получения дополнительной информации об этих
пунктах.
IGNORE
или number
LINESIGNORE
пункт вызывает первое
number
ROWSnumber
строки в XML-файле, который будет пропущен. Это походит LOAD DATA
оператор IGNORE ... LINES
пункт.
Чтобы иллюстрировать, как этот оператор используется, предположите, что нам создали таблицу следующим образом:
USE test;CREATE TABLE person ( person_id INT NOT NULL PRIMARY KEY, fname VARCHAR(40) NULL, lname VARCHAR(40) NULL, created TIMESTAMP);
Предположите далее, что эта таблица первоначально пуста.
Теперь предположите, что у нас есть простой XML-файл person.xml
, чье содержание
как показано здесь:
<?xml version="1.0"?><list> <person person_id="1" fname="Pekka" lname="Nousiainen"/> <person person_id="2" fname="Jonas" lname="Oreland"/> <person person_id="3"><fname>Mikael</fname><lname>Ronström</lname></person> <person person_id="4"><fname>Lars</fname><lname>Thalmann</lname></person> <person><field name="person_id">5</field><field name="fname">Tomas</field> <field name="lname">Ulin</field></person> <person><field name="person_id">6</field><field name="fname">Martin</field> <field name="lname">Sköld</field></person></list>
Каждый из допустимых форматов XML, обсужденных ранее, представляется в этом файле в качестве примера.
Импортировать данные в person.xml
в person
таблица,
можно использовать этот оператор:
mysql>LOAD XML LOCAL INFILE 'person.xml'
->INTO TABLE person
->ROWS IDENTIFIED BY '<person>';
Query OK, 6 rows affected (0.00 sec)Records: 6 Deleted: 0 Skipped: 0 Warnings: 0
Здесь, мы принимаем это person.xml
располагается в каталоге данных MySQL. Если
файл не может быть найден, следующие ошибочные результаты:
ERROR 2 (HY000): File '/person.xml' not found (Errcode: 2)
ROWS IDENTIFIED BY '<person>'
пункт означает что каждый
<person>
элемент в XML-файле считают эквивалентным строке в таблице, в которую должны быть
импортированы данные. В этом случае это person
таблица в test
база данных.
Как может быть замечен ответом по серверу, 6 строк были импортированы в test.person
таблица. Это может быть проверено простым SELECT
оператор:
mysql> SELECT * FROM person;
+-----------+--------+------------+---------------------+| person_id | fname | lname | created |+-----------+--------+------------+---------------------+| 1 | Pekka | Nousiainen | 2007-07-13 16:18:47 || 2 | Jonas | Oreland | 2007-07-13 16:18:47 || 3 | Mikael | Ronström | 2007-07-13 16:18:47 || 4 | Lars | Thalmann | 2007-07-13 16:18:47 || 5 | Tomas | Ulin | 2007-07-13 16:18:47 || 6 | Martin | Sköld | 2007-07-13 16:18:47 |+-----------+--------+------------+---------------------+6 rows in set (0.00 sec)
Это показывает, как утверждено ранее в этом разделе, что любые из 3 разрешенных форматов XML могут появиться в
единственном файле и быть считаны в использовании LOAD
XML
.
Инверсия вышеупомянутой работы — то есть, выводя табличные данные MySQL в XML-файл — может быть выполнена, используя mysql клиент от системной оболочки, как показано здесь:
--xml
опция
заставляет mysql клиент использовать форматирование XML для его
вывода; -e
опция заставляет клиент сразу выполнить SQL-оператор после опции.
shell>mysql --xml -e "SELECT * FROM test.person" > person-dump.xml
shell>cat person-dump.xml
<?xml version="1.0"?><resultset statement="SELECT * FROM test.person" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <row> <field name="person_id">1</field> <field name="fname">Pekka</field> <field name="lname">Nousiainen</field> <field name="created">2007-07-13 16:18:47</field> </row> <row> <field name="person_id">2</field> <field name="fname">Jonas</field> <field name="lname">Oreland</field> <field name="created">2007-07-13 16:18:47</field> </row> <row> <field name="person_id">3</field> <field name="fname">Mikael</field> <field name="lname">Ronström</field> <field name="created">2007-07-13 16:18:47</field> </row> <row> <field name="person_id">4</field> <field name="fname">Lars</field> <field name="lname">Thalmann</field> <field name="created">2007-07-13 16:18:47</field> </row> <row> <field name="person_id">5</field> <field name="fname">Tomas</field> <field name="lname">Ulin</field> <field name="created">2007-07-13 16:18:47</field> </row> <row> <field name="person_id">6</field> <field name="fname">Martin</field> <field name="lname">Sköld</field> <field name="created">2007-07-13 16:18:47</field> </row></resultset>
Можно проверить, что дамп допустим, создавая копию person
и затем импортируя файл
дампа в новую таблицу, как это:
mysql>USE test;
mysql>CREATE TABLE person2 LIKE person;
Query OK, 0 rows affected (0.00 sec)mysql>LOAD XML LOCAL INFILE 'person-dump.xml'
->INTO TABLE person2;
Query OK, 6 rows affected (0.01 sec)Records: 6 Deleted: 0 Skipped: 0 Warnings: 0mysql>SELECT * FROM person2;
+-----------+--------+------------+---------------------+| person_id | fname | lname | created |+-----------+--------+------------+---------------------+| 1 | Pekka | Nousiainen | 2007-07-13 16:18:47 || 2 | Jonas | Oreland | 2007-07-13 16:18:47 || 3 | Mikael | Ronström | 2007-07-13 16:18:47 || 4 | Lars | Thalmann | 2007-07-13 16:18:47 || 5 | Tomas | Ulin | 2007-07-13 16:18:47 || 6 | Martin | Sköld | 2007-07-13 16:18:47 |+-----------+--------+------------+---------------------+6 rows in set (0.00 sec)
Используя a ROWS IDENTIFIED BY '<
пункт, возможно импортировать данные из того же самого XML-файла в таблицы базы данных с различными
определениями. Для этого примера предположите, что Вам назвали файл tagname
>'address.xml
который содержит следующий XML:
<?xml version="1.0"?><list> <person person_id="1"> <fname>Robert</fname> <lname>Jones</lname> <address address_id="1" street="Mill Creek Road" zip="45365" city="Sidney"/> <address address_id="2" street="Main Street" zip="28681" city="Taylorsville"/> </person> <person person_id="2"> <fname>Mary</fname> <lname>Smith</lname> <address address_id="3" street="River Road" zip="80239" city="Denver"/> <!-- <address address_id="4" street="North Street" zip="37920" city="Knoxville"/> --> </person></list>
Можно снова использовать test.person
таблица как определено ранее в этом разделе,
после очистки всех существующих записей от таблицы и затем показа ее структуры как показано здесь:
mysql<TRUNCATE person;
Query OK, 0 rows affected (0.04 sec)mysql<SHOW CREATE TABLE person\G
*************************** 1. row *************************** Table: personCreate Table: CREATE TABLE `person` ( `person_id` int(11) NOT NULL, `fname` varchar(40) DEFAULT NULL, `lname` varchar(40) DEFAULT NULL, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`person_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin11 row in set (0.00 sec)
Теперь создайте address
таблица в test
база данных
используя следующий CREATE TABLE
оператор:
CREATE TABLE address ( address_id INT NOT NULL PRIMARY KEY, person_id INT NULL, street VARCHAR(40) NULL, zip INT NULL, city VARCHAR(40) NULL, created TIMESTAMP);
Импортировать данные из XML-файла в person
таблица, выполните следующий LOAD
XML
оператор, который определяет, что строки должны быть определены <person>
элемент, как показано здесь;
mysql>LOAD XML LOCAL INFILE 'address.xml'
->INTO TABLE person
->ROWS IDENTIFIED BY '<person>';
Query OK, 2 rows affected (0.00 sec)Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
Можно проверить, что записи были импортированы, используя a SELECT
оператор:
mysql> SELECT * FROM person;
+-----------+--------+-------+---------------------+| person_id | fname | lname | created |+-----------+--------+-------+---------------------+| 1 | Robert | Jones | 2007-07-24 17:37:06 || 2 | Mary | Smith | 2007-07-24 17:37:06 |+-----------+--------+-------+---------------------+2 rows in set (0.00 sec)
Начиная с <address>
у элементов в XML-файле нет никаких соответствующих
столбцов в person
таблица, они пропускаются.
Импортировать данные из <address>
элементы в address
таблица, используйте LOAD XML
оператор, показанный здесь:
mysql>LOAD XML LOCAL INFILE 'address.xml'
->INTO TABLE address
->ROWS IDENTIFIED BY '<address>';
Query OK, 3 rows affected (0.00 sec)Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
Можно видеть, что данные были импортированы, используя a SELECT
оператор, такой как этот:
mysql> SELECT * FROM address;
+------------+-----------+-----------------+-------+--------------+---------------------+| address_id | person_id | street | zip | city | created |+------------+-----------+-----------------+-------+--------------+---------------------+| 1 | 1 | Mill Creek Road | 45365 | Sidney | 2007-07-24 17:37:37 || 2 | 1 | Main Street | 28681 | Taylorsville | 2007-07-24 17:37:37 || 3 | 2 | River Road | 80239 | Denver | 2007-07-24 17:37:37 |+------------+-----------+-----------------+-------+--------------+---------------------+3 rows in set (0.00 sec)
Данные от <address>
элемент, который включается в XML-комментарии, не
импортируется. Однако, с тех пор есть a person_id
столбец в address
таблица, значение person_id
атрибут от родителя <person>
элемент для каждого <address>
импортируется
в address
таблица.
Соображения безопасности. Как с LOAD
DATA
оператор, передача XML-файла от хоста клиента до узла сервера инициируется сервером MySQL. В
теории исправленный сервер мог быть создан, который скажет клиентской программе передавать файл выбора сервера,
а не файл, названный клиентом в LOAD XML
оператор. Такой сервер мог получить доступ к любому файлу на хосте
клиента, к которому у клиентского пользователя есть доступ для чтения.
В Веб-среде клиенты обычно соединяются с MySQL от веб-сервера. Пользователь, который может выполнить любую
команду против сервера MySQL, может использовать LOAD
XML LOCAL
считать любые файлы, к которым у процесса веб-сервера есть доступ для чтения. В этой
среде клиент относительно сервера MySQL является фактически веб-сервером, не удаленной программой, выполняемой
пользователем, который соединяется с веб-сервером.
Можно отключить загрузку XML-файлов от клиентов, запуская сервер с --local-infile=0
или --local-infile=OFF
. Эта опция может также использоваться, запуская mysql клиент, чтобы отключить LOAD XML
для продолжительности клиентского сеанса.
Чтобы препятствовать тому, чтобы клиент загрузил XML-файлы из сервера, не предоставляйте FILE
полномочие к соответствующей учетной записи пользователя MySQL, или отменяют
это полномочие, если у клиентской учетной записи пользователя уже есть это.
Отмена FILE
полномочие (или не предоставление этого во-первых) сохраняет пользователя только от выполнения LOAD
XML INFILE
оператор (так же как LOAD_FILE()
функция; это не
препятствует тому, чтобы пользователь выполнился LOAD
XML LOCAL INFILE
. Чтобы отвергнуть этот оператор, следует запустить сервер или клиент с --local-infile=OFF
.
Другими словами, FILE
полномочие влияет только, может ли клиент считать файлы на сервере; у
этого нет никакого опирания, может ли клиент считать файлы на локальной файловой системе.
Для разделенных таблиц, используя механизмы хранения, которые используют блокировки таблицы, такой как MyISAM
, LOAD XML
не может сократить блокировки
раздела. Это не применяется к таблицам, используя механизмы хранения, которые используют блокировку на уровне
строки, такой как InnoDB
. Для
получения дополнительной информации см. Раздел 18.6.4, "Деля и
Блокируя".