У меня есть таблица ниже:
+ ----- + ------- + ------ + ------------ + | 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); } }