MySQL中的重复数据停止

时间:2015-08-19 08:47:28

标签: php mysql database duplicate-data

我有一张桌子:

+-----+-------+------+------------+
| 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约束来阻止它。

3 个答案:

答案 0 :(得分:0)

您需要更改数据库架构。通过RefId添加具有唯一索引的表,在这里您将使用Type" 1"来编写记录。在你的Yii模型中,方法beforesave检查你的Type if是1来写入添加的表,否则写入旧表。你需要在发现之前改变方法

我很抱歉我的英语

答案 1 :(得分:0)

请尝试:

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

作为保存前的自定义功能。并在规则中为您想要的字段调用它。我向您展示了单个字段refID

的模板

答案 2 :(得分:0)

我通过使用触发器解决了它,如下所示:

数据库触发

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);
    }
}