任何人都可以帮助我。我正在将一个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>
答案 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_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;