2015-08-19 4 views
1

У меня есть в таблице ниже:Дублирование данных Stop в MySQL

 
+-----+-------+------+------------+ 
| ID | RefID | Type | 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

вы также можете добавить свой код. И используете ли вы какую-либо фреймворк или только родной php – gecco

+0

Итак, добавьте уникальный составной ключ в 3 столбца, которые вы упомянули, где проблема? –

+0

Вы хотите добавить уникальный индекс и удалить дубликаты, не так ли? – Nightw0rk

ответ

0

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

И я прошу прощения за мой английский

+0

. Я разрешил ее с помощью триггера. Спасибо за ваши ответы. –

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

. Я разрешил его с помощью ошибки запуска и обработки в Model save(). Я использовал сигнал sqlstate в триггерах, которые разрешили мою проблему –

+0

cool, но Model save() или u означают функцию save()? Причина того, что функция save() обычно вызывается в контроллере .. и вы не должны использовать PDO или SQL-инструкции в контроллерах, u должен работать в моделях. Контроллер должен быть гладким и меньшим по размеру –

+0

Я добавил код для него, и вы можете видеть его. Спасибо за ваши ответы. –

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); 
    } 
} 
Смежные вопросы