У меня есть таблица с тремя столбцами – id (pk), pageId (fk), name. У меня есть php-скрипт, который сбрасывает около 5000 записей в таблицу, причем примерно половина дубликатов, с одинаковым именем страницы и именем. Комбинация pageId и name должна быть уникальной. Каков наилучший способ предотвратить дублирование, сохраняемое в таблице, когда я прохожу через скрипт в php?
Первым шагом было бы установить уникальный ключ в таблице:
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: 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 } }
в любом случае это должно сделать вас просто отлично.