Правильный способ предотвращения дублирования записей с использованием MySQL или PHP

У меня есть таблица song которой есть songCategory и songName . Комбинация songCategory и songName устанавливается на уникальном уровне базы данных. Таким образом, даже если php пытается вставить базу данных дубликатов записей, это не позволит.

Проблема в том, что проект имеет функциональность, где пользователь может вставлять кучу песен одновременно. И, как вы знаете, повторная проверка записи для больших данных занимает очень много времени: для каждой песни я должен запросить, есть ли какая-либо песня с categoryID=x и songName=y . Поэтому мне нужны ваши предложения для решения этой проблемы без дополнительной проверки дубликатов.

У меня мало идей об этом, но я не совсем уверен, что они будут работать:

  • Мы все равно можем вставлять записи, если будет ошибка базы данных, мы просто continue цикл foreach.
  • Мы можем вызвать некоторую функцию в базе данных для проверки и удаления повторяющихся строк после каждой вставки (у меня нет опыта работы с пользовательскими функциями mysql)

Кстати, я использую Yii Framework с базой данных MySQL.

Ваши предложения?

Вы можете использовать временную таблицу. Попросите приложение php вставить все в таблицу temp, а затем вызвать запрос с такой логикой.

 insert into mainTable (field1, field2, etc) select field1, field2, etc from tempTable where (subquery to check for existing records goes here) 

Или вы можете использовать try / catch. Я не знаю php-синтаксиса, но так как многие другие языки могут делать такие вещи, я ожидал бы, что php сможет.

 try code to insert record catch if the error code is the one for duplicate records, do nothing. if it's something else, handle it accordingly. 

Я бы использовал REPLACE INTO вместо INSERT INTO

Таким образом, если он уже существует, он просто будет перезаписан.

Отказ от ответственности: используйте это с осторожностью. Вы не хотите, чтобы песня одного человека писала над песней другого человека.

Ссылка на REPLACE INTO на stackoverflow

почему вы не можете использовать конструкцию INSERT IGNORE?

Вы можете справиться с этим в своей модели Yii, создав правило пользовательской проверки.

 public function rules() { return array( array('song_name', 'checkUniqueSongInCat','on'=>'insert'), //check only on insert ); } public function checkUniqueSongInCat($attribute, $params) { if (my_check_for_unique_song() === false) { $this->addError('song_name','Song is not unique'); } }