Остановка дублирования данных в 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 запрос происходит, мне нужно остановить его с помощью UNIQUE key ограничения.

1

Решение

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

И я извиняюсь за мой английский

0

Другие решения

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

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

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

0

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

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);
}
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector