【问题标题】:Merging XML file with MySQL table将 XML 文件与 MySQL 表合并
【发布时间】:2026-01-12 23:40:01
【问题描述】:

我有一个如下所示的 XML 文件:

<?xml version="1.0"?>
<results>
  <row id="100"><name>name blah</name></row>
  <row id="200"><name>name blah blah</name></row>
  <row id="300"><name>name blah blah blah</name></row>
</results>

...还有一个简单的 MySQL 表:

CREATE TABLE `names` (
  `id` bigint(20) NOT NULL,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我想合并这两件事,以使用 XML 文件中不存在的行更新我的表。

考虑到 XML 文件和 MySQL 表包含超过 100k 行,实现此操作的最简单和最轻松的方法是什么,我想每周运行一次此更新...

非常感谢!

【问题讨论】:

    标签: mysql xml merge


    【解决方案1】:

    LOAD XML 语句 + MySQL 5.5 中的 REPLACE 子句

    代码示例-

    LOAD XML LOCAL INFILE 'names.xml'
    REPLACE
    INTO TABLE names
    ROWS IDENTIFIED BY '<row>';
    

    另一种方式 - Data Import tool(选择 XML 格式和追加/更新模式)

    【讨论】:

    • 有趣且快速的解决方案!谢谢!但是,我不确定我是否能够在我的服务器上使用 --xml 选项启动 mysql :( 现在将尝试其他解决方案...
    • 你不应该用 --xml 选项启动 mysql! LOAD XML 是 MySQL 5.5 支持的语句。就用它吧。我已经做到了,没有任何问题。
    • 呃...我的提供程序仍在 MySQL v5.0 上:-/ 我怀疑它是否会很快升级...我会看看有什么可能,这个解决方案似乎是最快的一个。 .. 我想让那个脚本超级自动化,然后在我的余生中忘记它,哈哈
    • 试用工具,新版本支持数据导入+命令行。
    • 感谢您的建议,但我仍然认为我的 ISP 的过时应用程序会有问题...我可以在本地测试它(我想我使用的 Navicat 也可以做同样的事情)但是我的想法是制作一个 php 脚本并偶尔在我的服务器上运行一个 CRON 作业来更新我的表...
    【解决方案2】:

    Mysql 从 v5.1 开始有一些 XML support。虽然 xml 格式不同,但它仍然是一个开始的地方。

    老实说,遍历该 xml 文件并执行 INSERT ... ON DUPLICATE IT UPATEREPLACE 的开销并没有那么大。解析和更新数据库应该不到一个小时。

    【讨论】:

    • 给我你做的总时间,我很想知道我离我有多远:D
    • 好的,一定会的! =) 我也很好奇 =)
    【解决方案3】:

    如果您不能使用 load xml 语句,您可以使用 powershell 将您的 xml 文件转换为 csv。

    $destTXT = "c:\file.txt"
    [xml]$xml = (gc c:\file.xml)
    $xml.results.row |
    select @{ L = 'ID';     E = { $_.id} },
           @{ L = 'Name';   E = { $_.name } } | export-csv $destTXT -NoTypeInformation
    (gc $destTXT) -replace('"','') | Out-File $destTXT -Force
    

    你的txt文件会变成这个

    ID,Name
    100,name blah
    200,name blah blah
    300,name blah blah blah
    

    您将能够使用加载数据语句。

    【讨论】: