我正在使用Yii 1.1.x并在执行插入时出现以下错误。
CDbCommand failed to execute the SQL statement: SQLSTATE[23000]:
Integrity constraint violation: 1062 Duplicate entry '5375' for key 'PRIMARY'
这发生在一个名为'competition_prizes'的表上 - 只有一个名为'id'的主键(没有其他索引或类似的东西)。
我可以看到有一行的id为5375,因此该条目已经存在(根据插入查询)。
控制器代码如下,在afterSave()功能中具有一些功能。
protected function setPrizes($prizes, $prize_type)
{
if(!empty($prizes) && is_array($prizes))
{
$prize_model = CompetitionPrizes::model();
$competition_id = $this->competition_id;
$prize_model->deleteAll('competition_id =:competition_id AND prize_type = :prize_type ',array(
':competition_id'=> $competition_id,
':prize_type'=> $prize_type
));
foreach($prizes as $prize_position => $prize_desc) :
$prize_model->setIsNewRecord(true);
$prize_model->setAttributes(compact('competition_id', 'prize_position', 'prize_type','prize_desc'));
$prize_model->save();
endforeach;
}
}
关于如何解决错误的任何想法 - 请注意我是Yii的新手所以要温柔:)
答案 0 :(得分:2)
而不是设置新的记录标志,
$prize_model->setIsNewRecord(true); // sometimes it may not work.
讨论setIsNewRecord
的问题here
你也可以这样做:
$prize_model->isNewRecord = true;
答案 1 :(得分:2)
在$prize_model->setIsNewRecord(true)
(或$prize_model->isNewRecord = true
)之上,您还必须清空id属性。正如我在上面的评论中提到的,setIsNewRecord仅确定在调用save()时是否使用了插入或更新方案。如果您的PK仍然设置,它将只是尝试插入这些值设置,导致重复错误。
以下应该可以解决问题:
$id = NULL;
foreach($prizes as $prize_position => $prize_desc) :
$prize_model->setIsNewRecord(true);
$prize_model->setAttributes(compact('id', 'competition_id', 'prize_position', 'prize_type','prize_desc'));
$prize_model->save();
endforeach;
答案 2 :(得分:0)
foreach($prizes as $prize_position => $prize_desc) :
$prize_model->setIsNewRecord(true);
$prize_model->id = null;
$prize_model->setAttributes(compact('competition_id', 'prize_position', 'prize_type','prize_desc'));
$prize_model->save();
endforeach;
它应该有用