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

时间:2010-02-08 05:36:51

标签: php mysql

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

4 个答案:

答案 0 :(得分:106)

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

ALTER TABLE thetable ADD UNIQUE INDEX(pageid, name);

然后你必须决定在复制时你想做什么。你应该:

  1. 忽略它?

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

    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')
    
  3. 更新一些计数器?

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

您可以在MySQL数据库中将PageID和Name设置为Unique索引。这样,当您插入行时,它将导致错误,PHP可以忽略该错误,您可以转到下一行。

这假设您要单独插入行。 AKA:

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

答案 3 :(得分:1)

从mysql点你可以做到

alter table YOURTABLE add unique index(pageId, name);

如果你的措辞是正确的,你想从php那里做,你可以做

$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
   }
}
无论哪种方式,你应该没事。