【问题标题】:How To Use LOAD DATA LOCAL INFILE REPLACE如何使用 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 的情况下工作。我会先在表的测试副本上运行它...
  • 如有疑问,创建目标表的副本,然后导入该副本。通过这种方式,您可以看到当您真正导入时会发生什么,而不会冒真实数据的风险。如前所述,您所写的内容看起来不错。

标签: php mysql csv load-data-infile


【解决方案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

【讨论】:

    猜你喜欢
    • 2012-06-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多