Дублирование данных в MySQL

У меня есть таблица ниже:

 + ----- + ------- + ------ + ------------ +
 |  ID |  RefID |  Тип |  EventTime |
 + ----- + ------- + ------ + ------------ +
 |  101 |  228 |  1 |  1437195633 |
 |  102 |  228 |  5 |  1437195633 |
 |  103 |  228 |  1 |  1437195633 |
 |  104 |  228 |  1 |  1437195442 |
 |  105 |  228 |  1 |  1437195442 |
 |  106 |  228 |  5 |  1437195442 |
 |  107 |  228 |  1 |  1437165634 |
 |  108 |  228 |  5 |  1437165442 |
 |  109 |  228 |  1 |  1437165634 |
 |  110 |  228 |  5 |  1437165442 |
 + ----- + ------- + ------ + ------------ +

В этом я хочу прекратить вставлять duplicate данные на основе столбцов RefID,Type,EventTime только при значении Type = 1 .

В приведенной выше таблице ID пара является дубликатом (101,103), (104,105), (107,109) .

Если теперь я добавлю другие данные, скажите:

 INSERT INTO table VALUES('',228,1,1437165634); 

Тогда он не должен insert . Я проверяю при вставке в эту таблицу, но это не работает, так как я проверил в то же время 2 insert запроса 2 insert , мне нужно остановить его, используя ограничения UNIQUE key .

Вам нужно изменить архитектуру БД. Добавьте таблицу с уникальным индексом по RefId, здесь вы напишете запись с типом «1». В вашей модели Yii в методе beforesave проверьте свой тип, если 1 для записи в добавленной таблице, иначе напишите в старую таблицу. И вам нужно изменить метод beforefind

И мне жаль, мой английский

Пожалуйста попробуйте:

 public function unique($attribute, $params) { if(!empty($model_name)){ $this->addError('RefID', 'RefID already exists! Please choose a different one'); return true;} } 

как пользовательская функция перед сохранением. и назовите его для полей, которые вы хотите в правиле. Я показываю вам шаблон для одного поля refID

Я решил это, используя триггер, как показано ниже:

DB Trigger

 delimiter $$ drop trigger if exists stop_duplicate $$ create trigger stop_duplicate before insert on table for each row begin set @found := false; if new.Type = 1 then SELECT TRUE INTO @found FROM table WHERE RefID = new.RefID AND EventTime= new.EventTime AND Type= new.Type; if @found then signal sqlstate '23000' set message_text = 'CUSTOM_MSG_DUPLICATE'; end if; end if; end $$ delimiter ; 

Код Yii

 public function save($runValidation = true, $attributes = null) { Yii::log(__METHOD__.":: Start ", 'info'); try { return parent::save(); } catch (Exception $e) { $errorInfo = $e instanceof PDOException ? $e->errorInfo : null; $message = $e->getMessage(); Yii::log(__METHOD__ . ": errorcode :{$e->getCode()}, errormessage:{$message} ", 'info'); // Added for handling duplicate entry issue for index if ((int) $e->getCode() === 23000 && strpos($message, 'CUSTOM_MSG_DUPLICATE') !== false) { return false; } throw new CDbException(Yii::t('yii', 'CDbCommand failed to execute the SQL statement: {error}', array('{error}' => $message)), (int) $e->getCode(), $errorInfo); } }