Php 避免重复输入mysql数据库的最佳方法

Php 避免重复输入mysql数据库的最佳方法,php,mysql,Php,Mysql,我有一个包含3列的表-id(pk)、pageId(fk)、name。我有一个php脚本,它将大约5000条记录转储到表中,其中大约一半是重复的,具有相同的pageId和名称。pageId和名称的组合应该是唯一的。在php中循环脚本时,防止重复项保存到表中的最佳方法是什么?您可以将PageID和名称设置为MySQL数据库中的唯一索引。这样,当您插入行时,将导致错误,PHP可以忽略该错误,您可以直接转到下一行 这假定您正在单独插入行。又名: foreach($large_data as $field

我有一个包含3列的表-id(pk)、pageId(fk)、name。我有一个php脚本,它将大约5000条记录转储到表中,其中大约一半是重复的,具有相同的pageId和名称。pageId和名称的组合应该是唯一的。在php中循环脚本时,防止重复项保存到表中的最佳方法是什么?

您可以将PageID和名称设置为MySQL数据库中的唯一索引。这样,当您插入行时,将导致错误,PHP可以忽略该错误,您可以直接转到下一行

这假定您正在单独插入行。又名:

foreach($large_data as $fields)
{
    mysql_query("INSERT INTO TABLE (`Something`) VALUES('".$fields['something']."');
}

从mysql的角度来看,您可以

alter table YOURTABLE add unique index(pageId, name);
$already_done = array();
foreach ($records as $record)
{
   $unique_hash = md5($record['name'].$record['pageId']);
   if (!in_array($unique_hash, $already_done))
   {
      $already_done[] = $unique_hash;
      // sql insert here
   }
}
如果您的措辞是正确的,并且您希望从php执行此操作,那么您可以执行以下操作:

alter table YOURTABLE add unique index(pageId, name);
$already_done = array();
foreach ($records as $record)
{
   $unique_hash = md5($record['name'].$record['pageId']);
   if (!in_array($unique_hash, $already_done))
   {
      $already_done[] = $unique_hash;
      // sql insert here
   }
}

不管用哪种方法,这些都可以很好地解决问题。

您也可以忽略mysql的错误:INSERT ignore INTO TABLE。。。它将忽略键错误,跳过该插入并继续下一步。

第一步是在表上设置唯一键:

ALTER TABLE thetable ADD UNIQUE INDEX(pageid, name);
然后你必须决定当有一个复制品时你想做什么。你应:

  • 忽略它

    INSERT IGNORE INTO thetable (pageid, name) VALUES (1, "foo"), (1, "foo");
    
  • 是否覆盖以前输入的记录

    INSERT INTO thetable (pageid, name, somefield)
    VALUES (1, "foo", "first")
    ON DUPLICATE KEY UPDATE (somefield = 'first')
    
    INSERT INTO thetable (pageid, name, somefield)
    VALUES (1, "foo", "second")
    ON DUPLICATE KEY UPDATE (somefield = 'second')
    
  • 更新一些计数器

    INSERT INTO thetable (pageid, name)
    VALUES (1, "foo"), (1, "foo")
    ON DUPLICATE KEY UPDATE (pagecount = pagecount + 1)
    

  • 故意允许mysql_query()在遇到重复行时抛出PHP警告是一种混乱(它会使日志变得混乱,资源相对密集,等等)。特别是在一开始就防止它们的时候,就像使用MySQL的
    INSERT IGNORE
    功能一样简单,在其他解决方案中提到了这一点。此外,当大容量插入语法可用时,在循环中插入是低效的。当然,如果在脚本开始之前表中已经有记录,这些记录就不会出现在
    $ready\u done
    中。非常感谢,这是对我在堆栈上研究了一段时间的一个问题的极好回答。