我有一张桌子:
+-----+-------+------+------------+ | 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
约束来阻止它。
答案 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);
}
}