如何使用 LOAD DATA LOCAL INFILE REPLACE

Posted

技术标签:

【中文标题】如何使用 LOAD DATA LOCAL INFILE REPLACE【英文标题】:How To Use LOAD DATA LOCAL INFILE REPLACE 【发布时间】:2014-01-25 21:11:52 【问题描述】:

我有一个脚本,用于将数据从一个数据库迁移到另一个数据库。我已经通过使用常规的 mysql 插入和更新脚本来做到这一点。只是时间太长了。

在任何情况下,我已经将我想在新数据库中更新的所有数据转储到一个 csv 中,我只是担心如果我运行这个脚本,我会得到重复的条目。我没有匹配的“id”,所以我无法对下面列出的 REPLACE 脚本进行比较。我想知道是否有人可以提醒我这个脚本是否正确。

目前我在新数据库中有数据行,如果它们匹配,我只想用 csv 中的新数据覆盖新数据库中的任何字段。 “archived_id_number”字段是我可以匹配的唯一字段,但它不是主键。

有人可以向我射击以下内容吗:

如果 csv 上的 archived_id_number 与新数据库中的数据匹配,我想用 csv 中的数据替换字段中的任何数据。如果没有匹配,我想将数据作为新行插入。

$sql = '
LOAD DATA LOCAL INFILE "'.$theFile.'" 
REPLACE INTO TABLE Product 
FIELDS TERMINATED BY "|" 
LINES TERMINATED BY "\\n"
(archived_id_number, sku, name, upc, account_id, shippingBox_id, unit_cost, supplier_id, description, productLength, productWidth, productHeight)
;';

感谢您的帮助!!!

【问题讨论】:

虽然它不是主键,但我认为archived_id_number 上有一个UNIQUE 是的,没错,sku上有唯一性 那么它应该可以在没有原始表构建和 csv sn-p 的情况下工作。我会先在表的测试副本上运行它... 如有疑问,创建目标表的副本,然后导入该副本。通过这种方式,您可以看到当您真正导入时会发生什么,而不会冒真实数据的风险。如前所述,您所写的内容看起来不错。 【参考方案1】:

作为对我评论的详细说明,虽然您的查询看起来不错,但我建议您针对当前表的副本进行测试。这将使您能够准确地确认会发生什么,而不会危及您现有的数据。您可以通过执行以下 3 个查询来实现这一点(显然是在 php 中插入以执行 $sql)。

$sql = '
    CREATE TABLE `_test_Product` LIKE Product; 
';

$sql = '
    INSERT `_test_Product` SELECT * FROM Product;
';

$sql = '
    LOAD DATA LOCAL INFILE "'.$theFile.'" 
    REPLACE INTO TABLE `_test_Product`
    FIELDS TERMINATED BY "|" 
    LINES TERMINATED BY "\\n"
    (
        archived_id_number, 
        sku, name, upc, account_id, shippingBox_id, unit_cost, 
        supplier_id, description, productLength, productWidth, productHeight
    );
';

(更多信息请参见Duplicating a MySQL table, indexes and data)

【讨论】:

以上是关于如何使用 LOAD DATA LOCAL INFILE REPLACE的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:启用 LOAD DATA LOCAL INFILE

如何在mysql-connector-java上允许LOAD DATA LOCAL INFILE?

LOAD DATA LOCAL INFILE 不导入任何记录

load data local file实验报告

Mybatis拦截器 mysql load data local 内存流处理

使用 LOAD DATA LOCAL INFILE,sysbench 导数速度提升30%