У меня есть таблица song
которой есть songCategory
и songName
. Комбинация songCategory
и songName
устанавливается на уникальном уровне базы данных. Таким образом, даже если php пытается вставить базу данных дубликатов записей, это не позволит.
Проблема в том, что проект имеет функциональность, где пользователь может вставлять кучу песен одновременно. И, как вы знаете, повторная проверка записи для больших данных занимает очень много времени: для каждой песни я должен запросить, есть ли какая-либо песня с categoryID=x
и songName=y
. Поэтому мне нужны ваши предложения для решения этой проблемы без дополнительной проверки дубликатов.
У меня мало идей об этом, но я не совсем уверен, что они будут работать:
continue
цикл foreach. Кстати, я использую 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'); } }