【问题标题】:Efficient way to check record uniqueness during bulk insert in MySql在MySql中批量插入期间检查记录唯一性的有效方法
【发布时间】:2019-10-31 16:58:48
【问题描述】:

我正在使用单个查询在 MySQL 表中插入 1000 条或更多记录。我正在通过 PHP 循环生成查询,如下所示:

INSERT INTO `favorite_colors` (`ID`, `person_id`, `email`)
VALUES
(1, 1, '1@yellow.com'),
(2, 1, '2@yellow.com'),
(3, 2, '2@blue.com'),
(4, 2, '2@blue.com'),
(5, 3, '1@green.com');

此数据来自一个可能有重复条目的大型 CSV 文件。如果我想在将两列插入表之前检查记录的唯一性,有什么办法吗?我不想检查循环中的每一条记录,因为我认为这不是一种有效的方法。我的数据库没有唯一约束,因此可以轻松插入重复的条目。数据库很旧并且已经有重复的条目,所以我不能只添加唯一约束。 如果任何记录已经存在,我需要一种方法来验证数据库中的这些批量记录。我需要单独显示这些已经存在于数据库中的记录。

【问题讨论】:

  • 见插入忽略。有了适当的索引,就不需要“检查”任何东西
  • 我的数据库中没有唯一约束,数据库可以用它来识别重复项。
  • 那么,为什么不解决这个问题!?!

标签: php mysql database


【解决方案1】:

如果您想在 php 结束时处理此问题,只需为每个值创建一个哈希,然后在创建查询之前检查它是否存在,例如

$already_done = array();
foreach ($csvRecords as $record)
{
   $unique_hash = md5($record['person_id'].$record['email']);
   if (!in_array($unique_hash, $already_done))
   {
      $already_done[] = $unique_hash;
      // create sql insert query here
   }
}

【讨论】:

    【解决方案2】:

    首先,ID 看起来像主键,所以你需要的不是完美的解决方案,因为同一个 ID 会有不同的记录。无论如何,以下是您所要求的解决方案。

    我假设您从某个结构中获取元素,即数组:

    $rec = ['ID' => 1, 'person_id' => 1, 'email' => '1@yellow.com'];
    

    所以你可以创建一些控制数组:

    $added = [];
    

    然后对于您加入字段的每条记录:

    $line = $rec['ID'] . '_' . $rec['person_id'] . "_" . $rec['email'];
    

    假设 ID 和 person_id 是整数,你用下划线保证唯一性。

    然后你检查:

    if(!isset($added[$line])) {
        $added[$line] = true;
    
        // proceed insert here
    }
    

    您也可以尝试将 $line 转换为一些唯一的哈希

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 1970-01-01
      • 2016-01-02
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2017-05-26
      相关资源
      最近更新 更多