У меня есть таблица с тремя столбцами - id (pk), pageId (fk), name. У меня есть php script, который выгружает около 5000 записей в таблицу, причем примерно половина дубликатов, с одинаковым именем страницы и именем. Комбинация pageId и name должна быть уникальной. Каков наилучший способ предотвратить дублирование, сохраняемое в таблице, когда я прохожу через script в php?
Лучший способ избежать дублирования ввода в базу данных mysql
Ответ 1
Первым шагом будет установка уникального ключа в таблице:
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)
Ответ 2
Вы также можете игнорировать ошибку с помощью mysql: INSERT IGNORE INTO TABLE... он будет игнорировать ошибку ключа, пропустить эту вставку и перейти к следующему.
Ответ 3
Вы можете установить индекс страницы и имя для уникального в базе данных MySQL. Таким образом, когда вы вставляете строки, это приведет к ошибке, которую PHP может игнорировать, и вы можете просто перейти к следующей строке.
Предполагается, что вы вставляете строки по отдельности. AKA:
foreach($large_data as $fields)
{
mysql_query("INSERT INTO TABLE (`Something`) VALUES('".$fields['something']."');
}
Ответ 4
Из точки 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
}
}
в любом случае это должно сделать вас просто отлично.