Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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
   }
}

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