2015-03-23 3 views
0

Может ли кто-нибудь помочь мне с этим. Я загружаю XML-файл в MySQL, имена столбцов не совпадают, поэтому я пытаюсь использовать предложение SET, но я продолжаю получать сообщение об ошибке Неизвестное имя столбца «ReferenceNo» в списке полей?Ошибка SET Clause # 1054 - Неизвестный столбец в 'списке полей'

Это MSQL Query

LOAD XML LOCAL INFILE 'C:/modified.xml' 
INTO TABLE wp_posts ROWS IDENTIFIED BY '<Course>' 
SET ID = ReferenceNo, 
    post_title = CourseName, 
    post_type = 'course'; 

Это фрагмент моего файла XML:

<?xml version="1.0" encoding="utf-8"?> 
    <Course> 
    <ReferenceNo>64055</ReferenceNo> 
    <ProviderCode>CO</ProviderCode> 
    <ProviderName>Training Centre</ProviderName> 
    <CourseID>CO123</CourseID> 
    <CourseName>IT Maintenance - Short Course</CourseName> 
    <CourseTypeID>1</CourseTypeID> 
    <CourseTypeName>1</CourseTypeName> 
    <LocationCode>70203</LocationCode> 
    <LocationName>Address of Training Centre</LocationName> 
    <StartDate>2015.12.07</StartDate> 
    <FinishDate>2016.03.04</FinishDate> 
    </Course> 
+1

Является ли порядок, в котором элементы отображаются в каждом '' гарантированно всегда будет одинаковым? – eggyal

ответ

0

документация LOAD XML не объясняет очень хорошо, как применяются список столбцов и SET положения. Он просто заявляет:

Следующие пункты работают в основном так же, как для LOAD XML, как они делают для LOAD DATA:

  • LOW_PRIORITY или CONCURRENT

  • LOCAL

  • REPLACE или IGNORE

  • CHARACTER SET

  • (column_or_user_var,...)

  • SET

См 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; 
+0

Привет, эггьял, спасибо за вашу помощь, таблица temp определяет способ пойти, я думаю, потому что мне нужно вставить данные из одной таблицы в несколько таблиц, чтобы она пометила все поля для меня. Очень ценю благодарность за помощь :) – Donz

0

Вы должны вручную отобразить XML в таблицу, и это предполагает, что каждая строка будет быть в том же порядке.

Вы не можете использовать предложение «SET» и ссылаться на строки по имени атрибута xml. Это было бы неплохо, но, по-видимому, это ограничение текущей реализации.

Итак, вы хотите что-то подобное. В этом случае я сокращаю пример до первых 4 столбцов, вы можете развернуть остальные. Я также выбираю 5-й столбец XML в переменной @ var1, поэтому мы можем использовать его позже, я не уверен, что вам это нужно, но это пример того, как вы получаете данные из XML в переменную, чтобы позже использовать в SET - - хотя это в основном полезно, если вам нужно каким-то образом изменить данные, если вы просто переназначаете имена, тогда вы все равно это сделаете с помощью этого синтаксиса. Я также установил ваш статический столбец post_type.

LOAD XML LOCAL INFILE 'C:/modified.xml' 
INTO TABLE wp_posts ROWS IDENTIFIED BY '<Course>' 
(ID, ProviderCode, ProviderName, CourseID, @var1) 
SET 
    test_column=CONCAT('test', @var1), 
    post_type='course'; 
+0

Привет, Трент, благодарю вас за ваш ответ и уделите время, чтобы помочь. Это было большой помощью, потому что мне приходится манипулировать некоторыми данными на более позднем этапе. , – Donz

Смежные вопросы