【问题标题】:Yii - CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '5375' for key 'PRIMARY'Yii - CDbCommand 未能执行 SQL 语句:SQLSTATE [23000]:完整性约束违规:1062 键 'PRIMARY' 的重复条目 '5375'
【发布时间】:2014-02-15 13:45:08
【问题描述】:

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

【问题讨论】:

    标签: sql activerecord yii frameworks


    【解决方案1】:

    除了$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】:

      而不是设置新记录标志,

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

      setIsNewRecord 的问题在here 讨论

      你也可以这样做:

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

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

      【讨论】:

      • Kumar: setIsNewRecord(true) 与 isNewRecord = true 完全一样; __set 魔术函数最终调用了 set 方法。您提出的第 2 点是解决问题的方法,取消设置 PK 属性。 setIsNewRecord 只是更改调用 save() 时使用的场景,而不更改属性。
      【解决方案3】:
        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;
      

      它应该可以工作

      【讨论】:

      • 这与 Blizz 接受的答案有何不同?设置 $prize_model->id = null 重要吗?如果是,为什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 2013-09-28
      • 2016-01-16
      相关资源
      最近更新 更多