由于存在错误,数据中包含NULL的MySQL XML导出不会重新导入

时间:2013-03-22 11:46:40

标签: mysql xml import null export

使用MySQL CLI命令从表中导出行,例如: -

mysql -h mysql --user=root --password=root --database dms_home --xml -e "SELECT * FROM users WHERE account=4149;" >/var/www/scripts/output/1187515/1187515_users.sql

输出文件: -

<resultset statement="SELECT * FROM accounts WHERE accnum=1187515" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <row>
    <field name="id">4149</field>
    <field name="accnum">1187515</field>
    <field name="applicationdate">0000-00-00</field>
    <field name="introducer"></field>
    <field name="jointacc">0</field>
    <field name="consultancy">0</field>
    <field name="storage">0</field>
    <field name="digitalonly">0</field>
    <field name="membership" xsi:nil="true" />
    <field name="promocode"></field>
    <field name="holdername" xsi:nil="true" />
    <field name="testaccount">0</field>
  </row>
</resultset>

现在您可以看到XML行“membership”和“holdername”中有2个空值,如果我转到另一个MySQL服务器/数据库并重新导入此文件,则显示警告开关我得到了回复: -

mysql -h mysql -u root -p dms_licence --show-warnings -e "load xml local infile '/var/www/scripts/output/1187515/1187515_account.sql' into table dms_licence.accounts";


Warning (Code 1263): Column set to default value; NULL supplied to NOT NULL column 'id' at row 1
Warning (Code 1263): Column set to default value; NULL supplied to NOT NULL column 'accnum' at row 1
Warning (Code 1263): Column set to default value; NULL supplied to NOT NULL column 'applicationdate' at row 1
Warning (Code 1263): Column set to default value; NULL supplied to NOT NULL column 'introducer' at row 1
Warning (Code 1263): Column set to default value; NULL supplied to NOT NULL column 'jointacc' at row 1
Warning (Code 1263): Column set to default value; NULL supplied to NOT NULL column 'consultancy' at row 1
Warning (Code 1263): Column set to default value; NULL supplied to NOT NULL column 'storage' at row 1
Warning (Code 1263): Column set to default value; NULL supplied to NOT NULL column 'digitalonly' at row 1
Warning (Code 1263): Column set to default value; NULL supplied to NOT NULL column 'promocode' at row 1
Warning (Code 1263): Column set to default value; NULL supplied to NOT NULL column 'testaccount' at row 1

表模式相同,插入数据不会导致主键或唯一键出现任何问题。那么为什么只插入空白记录呢?

2 个答案:

答案 0 :(得分:1)

这似乎是MySQL 5.5x的一个错误我没有使用MySQL 5.6x进行测试,但问题似乎是重新导入XML中定义的字段行为空值(在XML中表示为xsi:nil =“true”/&gt;)导致此问题。

用于读取XML的MySQL CLI导入过程似乎有问题,无法处理关闭字段节点的简便方法。

所以这失败了: -

但这有效: -

快速解决此问题仍然是PIPE输出文件,但然后更改: -

xsi:nil="true" /> 

xsi:nil="true"></field>

我认为这是安全的原因是由于xsi:nil永远不等于false,因为如果有一个值,那么它只会在标签之间放置。

那你怎么改变这个......好吧我现在要找出来并更新......更快。

希望这个初始指针可以帮助其他人,因为它让我疯狂到凌晨时分试图弄清楚出了什么问题。

答案 1 :(得分:1)

这是使用PHP快速搜索和替换文件,这是我用于整个项目的内容,请参阅此处 - &gt; find and replace values in a flat-file using PHP

但如果我能在Linux(CentOS)的操作系统级别上进行操作会很酷,所以PHP不需要处理大量文件,我需要搜索: -

" xsi:nil=\"true\" />"

并将其更改为: -

" xsi:nil=\"true\"></field>"

祝好运找到:)