У меня есть таблица ниже:
+-----+-------+------+------------+ | 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
запрос происходит, мне нужно остановить его с помощью UNIQUE key
ограничения.
Вам нужно изменить архитектуру БД. Добавьте таблицу с уникальным индексом по RefId, здесь вы напишете запись с типом «1». В вашей модели Yii в методе перед сохранением проверьте тип, если 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);
}
}