Activerecord 仅在创建新记录时修改SQL列

Activerecord 仅在创建新记录时修改SQL列,activerecord,yii,Activerecord,Yii,seq是DB表中的整数列 我想要一个CActiveRecord派生类,它在创建新记录时在SQL中执行seq=MAX(seq)+1,在更新现有记录时不修改seq列 如何解决?由于整个业务逻辑不清楚,但从上面的讨论来看,这可能是您的解决方案: 将以下两个函数添加到所需的模型类中,就完成了 public function beforeSave(){ if($this->isNewRecord){ $this->seq=$this->getNextSeq(); } r

seq
是DB表中的整数列

我想要一个CActiveRecord派生类,它在创建新记录时在SQL中执行
seq=MAX(seq)+1
,在更新现有记录时不修改
seq


如何解决?

由于整个业务逻辑不清楚,但从上面的讨论来看,这可能是您的解决方案:

将以下两个函数添加到所需的模型类中,就完成了

public function beforeSave(){
 if($this->isNewRecord){
   $this->seq=$this->getNextSeq();
  }

  return parent::beforeSave();
}

public function getNextSeq(){
  $maxSeq = $this->findBySql('select max(seq)+1 as seq from ' . $this->tableName(), array());
  return (!$maxSeq->seq ? 1 : $maxSeq->seq); 
}
只是一个旁注

如果您使用的是mysql,最后一个函数可以优化(当表为空时),例如


我不确定其他DBMS是否支持
coalesce
函数

你确定要这么做?如何处理并发插入?为什么不使用自动增量?您使用的是哪种dbms?@TonyHopkinson并发插入没有问题,因为我使用的是支持事务的InnoDB,并且INSERT语句是以一种(隐含的)方式处理的transaction@sakhunzai我使用auto increment的另一个目的是创建新插入行的ID,但我需要用户可编辑的字段seq,用于按用户对行进行排序。它与行ID(自动递增)不同。我在InnoDB中使用MySQL,所以表/索引上的最大值锁与您无关?这对我来说很重要。
 public function getNextSeq(){
      $maxSeq = $this->findBySql('select coalesce(max(seq),0)+1 as seq from ' . $this->tableName(), array());
      return $maxSeq->seq; 
    }