【问题标题】:What is better to check is product already imported in MySQL table?最好检查产品是否已导入 MySQL 表?
【发布时间】:2020-09-25 14:55:26
【问题描述】:

最好检查一下产品是否已经导入到 MySQL 表中:

1) 每个产品 ID 的每个查询

foreach ($products_to_import_from_xml as $product) {
    $is_exist = $modx->query("SELECT id FROM modx_ms2_products WHERE crm_id={$product['id']} LIMIT 1")->fetch(PDO::FETCH_COLUMN);
    if ($is_exist) continue;
    actually_import_new_product_because_it_not_exist_yet($product);
}

2) 使用“... WHERE `id` IN(array, of, all, importing, IDs)”?

$product_ids_to_import = [];
foreach ($products_to_import_from_xml as $product) {
    $product_ids_to_import[] = $product['id'];
}

$existing_products = $modx->query('SELECT crm_id FROM modx_ms2_products WHERE crm_id IN ('.implode(',', $product_ids_to_import).')')->fetchAll(PDO::FETCH_COLUMN);

foreach ($products_to_import_from_xml as $product) {
    $is_exist = in_array($product['id'], $existing_products);
    if ($is_exist) continue;
    actually_import_new_product_because_it_not_exist_yet($product);
}

【问题讨论】:

  • 你是如何导入的,你想在什么时候检查?
  • 请提供您的用例的最小可重现示例。事实上,您的问题缺乏上下文和精确性,并且不太可能得到有用的答案。
  • 我从 XML 文件(从库存程序导出)将产品导入网上商店,并想检查每个出口的产品是否已经存在于网上商店产品表中。如果我选择第一种方式,我可以为每个产品签入foreach,它是否已经存在并且不插入它并以这种方式检查每个下一个产品。或者我可以制作所有导出产品(我想导入)的数组列表,将它们传递给一个 MySQL 查询,通过这种方式获取所有已经导入的产品,当我在 foreach 循环导入产品时,检查每个产品存在于查询结果列表中
  • @Fullstack: 请edit your question 将信息放在那里而不是 cmets。
  • 用代码示例编辑了我的问题(+ 添加标签 PHP)

标签: php mysql import duplicates sql-insert


【解决方案1】:

一般来说,我会推荐 MySQL 中的insert ... on duplicate key syntax

为此,您需要对 products 表进行唯一(或主键)约束。如果它不存在,则创建它:

create unique index idx_product_id on products(product_id);

然后在你的应用代码的foreach循环中,你可以这样做:

insert into products(product_id, ...)  -- enumerate all target columns here
values(:product_id, ...)               -- enumerate all input parameters here
on duplicate key update set product_id = values(product_id);

当 MySQL 遇到一个已经存在的product_id 时,它会跳过insert 并转到on duplicate key 子句,在那里执行一个虚拟更新(该值实际上并没有重写,因为它是相同的就像表中已经存在的一样)。

请注意,如果您要导入大量数据,则可以考虑其他替代方法,而不是在应用程序端循环并每行执行单独的 insert。对于高性能插入,MySQL recommends the load data infile syntax,根据文档,它的运行速度是单个插入的 20 倍。这需要将您的 XML 数据转换为 CSV 格式,但值得付出努力。

【讨论】:

  • 我想回答这个问题,但这个答案比我的要好得多。学到了一些新东西。谢谢!
  • 我不能使用裸INSERT-query,我需要在PHP而不是MySQL中进行一些操作。我也在考虑INSERT - ON DUPLICATE - UPDATE 类型的查询,但我不能使用查询。我使用系统(CMS),所以它需要通过“处理器”来运行所有插件,并且不仅插入到该表中。我需要在我的 PHP 循环中获取有关导入状态的信息,所以这不是适合我的方式
猜你喜欢
  • 2014-10-27
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
相关资源
最近更新 更多