Yii - CDbCommand无法执行SQL语句:SQLSTATE [23000]:完整性约束违规:1062重复条目'5375'用于键'PRIMARY'

时间:2014-01-24 14:12:26

标签: sql activerecord yii frameworks

我正在使用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的新手所以要温柔:)

3 个答案:

答案 0 :(得分:2)

而不是设置新的记录标志,

$prize_model->setIsNewRecord(true); // sometimes it may not work.

讨论setIsNewRecord的问题here

你也可以这样做:

$prize_model->isNewRecord = true;
  1. Yii论坛建议在for循环中创建新对象。您可以查看here

  2. 您必须手动取消设置值,例如$model->id = null; 您可以获取详细信息here

答案 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;

它应该有用