如何使用 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 不导入任何记录