Лучший способ избежать дублирования ввода в базу данных mysql

У меня есть таблица с тремя столбцами – id (pk), pageId (fk), name. У меня есть php-скрипт, который сбрасывает около 5000 записей в таблицу, причем примерно половина дубликатов, с одинаковым именем страницы и именем. Комбинация pageId и name должна быть уникальной. Каков наилучший способ предотвратить дублирование, сохраняемое в таблице, когда я прохожу через скрипт в php?

Solutions Collecting From Web of "Лучший способ избежать дублирования ввода в базу данных mysql"

Первым шагом было бы установить уникальный ключ в таблице:

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) 

Вы также можете игнорировать ошибку с помощью mysql: INSERT IGNORE INTO TABLE … он будет игнорировать ключевую ошибку, пропустить эту вставку и перейти к следующему.

Вы можете установить идентификатор PageID и Name to Unique в базе данных MySQL. Таким образом, когда вы вставляете строки, это приведет к ошибке, которую PHP может игнорировать, и вы можете просто перейти к следующей строке.

Это предполагает, что вы вставляете строки по отдельности. AKA:

 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 } } 

в любом случае это должно сделать вас просто отлично.