документация LOAD XML
не объясняет очень хорошо, как применяются список столбцов и SET
положения. Он просто заявляет:
Следующие пункты работают в основном так же, как для LOAD XML
, как они делают для LOAD DATA
:
См Section 13.2.6, “LOAD DATA INFILE Syntax”, для получения дополнительной информации об этих пунктах.
Документация для LOAD DATA
состояний:
По умолчанию, когда нет списка столбцов не предусмотрен в конце LOAD DATA INFILE
заявления, входные линии, как ожидается, содержит поле для каждого столбца таблицы.Если вы хотите загрузить только некоторые из столбцов таблицы, необходимо задать список столбцов:
LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);
Вы также должны указать список столбцов, если порядок полей во входном файле отличается от порядка столбцов в Таблица. В противном случае MySQL не может определить, как сопоставлять поля ввода с столбцами таблицы.
Это не очевидно, как это приводит к LOAD XML
, поскольку (в отличие от файлов с разделителями) поля не должны появляться в последовательном порядке в течение документа XML. Кроме того, даже если поля являются в последовательном порядке, просто указывая соответствующие имена столбцов, в которые вы хотите загрузить такие поля. не работает.
документация продолжает говорить:
Список столбцов может содержать либо имена столбцов или пользовательские переменные. С пользовательскими переменными предложение SET
позволяет выполнять преобразования по их значениям перед назначением результата столбцам.
Этот подход делает работа с LOAD XML
, так при условии, что элементы появляются в последовательном порядке по всему документу можно сделать следующее:
LOAD XML LOCAL INFILE 'C:/modified.xml'
INTO TABLE wp_posts ROWS IDENTIFIED BY '<Course>'
(@ReferenceNo, @z, @z, @z, @CourseName)
SET ID = @ReferenceNo,
post_title = @CourseName,
post_type = 'course';
Однако, я думаю, что это может быть более стабильной (и разумной) для перехода через временную таблицу, которая больше всего отображается на вашу XML-схему:
CREATE TEMPORARY TABLE tmp_courses_xml (
ReferenceNo INT UNSIGNED,
ProviderCode CHAR(2),
ProviderName VARCHAR(255),
CourseID VARCHAR(15),
CourseName VARCHAR(255),
CourseTypeID INT UNSIGNED,
CourseTypeName VARCHAR(255),
LocationCode INT UNSIGNED,
LocationName VARCHAR(255),
StartDate CHAR(10),
FinishDate CHAR(10)
) ENGINE=MEMORY;
LOAD XML LOCAL INFILE 'C:/modified.xml'
INTO TABLE tmp_courses_xml
ROWS IDENTIFIED BY '<Course>';
INSERT INTO wp_posts
(ID, post_title, post_type)
SELECT ReferenceNo, CourseName, 'course' FROM tmp_courses_xml;
DROP TEMPORARY TABLE tmp_courses_xml;
Является ли порядок, в котором элементы отображаются в каждом '' гарантированно всегда будет одинаковым? –
eggyal