SET子句错误#1054 - '字段列表中的未知列'

时间:2015-03-23 11:31:52

标签: mysql xml

任何人都可以帮助我。我正在将一个XML文件加载到MySQL中,列名不一样,所以我试图使用SET子句但是我在字段列表中一直收到错误说“未知列名”“ReferenceNo”?

这是MSQL查询

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>

2 个答案:

答案 0 :(得分: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';

答案 1 :(得分:0)

LOAD XML文档没有很好地解释如何应用列列表和SET子句。它只是声明:

  

以下条款对LOAD XML的工作方式与对LOAD DATA的工作方式基本相同:

     
      
  • LOW_PRIORITYCONCURRENT

  •   
  • LOCAL

  •   
  • REPLACEIGNORE

  •   
  • 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;