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

我有一个表3列 – id(pk),pageId(fk),名称。 我有一个PHP脚本,转储大约5000个logging到表中,大约一半是重复的,具有相同的pageId和名称。 pageId和name的组合应该是唯一的。 什么是最好的方式来防止重复被保存到表中,因为我循环通过脚本在PHP?

第一步是在桌子上设置一个唯一的键:

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

那么当有重复时,你必须决定你想要做什么。 你应该:

  1. 忽略它?

     INSERT IGNORE INTO thetable (pageid, name) VALUES (1, "foo"), (1, "foo"); 
  2. 覆盖以前input的logging?

     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) 

你也可以用mysql忽略这个错误:INSERT IGNORE INTO TABLE …它会忽略关键错误,跳过这个插入并移到下一个。

您可以将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); 

如果你的措辞是正确的,你想从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 } } 

无论如何,那些应该做的就好了。