0
seq
은 DB 테이블의 정수 열입니다. 새 레코드를 만들 때만 SQL 열 수정
seq=MAX(seq)+1
할 것입니다 및 업데이트에 기존 레코드를
seq
열을 수정할 수 없습니다 것 CActiveRecord 파생 클래스를 원한다.
어떻게?
seq
은 DB 테이블의 정수 열입니다. 새 레코드를 만들 때만 SQL 열 수정
seq=MAX(seq)+1
할 것입니다 및 업데이트에 기존 레코드를
seq
열을 수정할 수 없습니다 것 CActiveRecord 파생 클래스를 원한다.
어떻게?
전체 비즈니스 로직이 명확하지만, 어떻게 든 위의 논의를하지 않기 때문에이 솔루션이 될 수 :
원하는 모델 클래스에 두 가지 기능을 다음과 같은 추가하고 작업이 완료!
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);
}
그냥 보조 노트
당신은 (테이블이 비어있을 때) 예를 들어
public function getNextSeq(){
$maxSeq = $this->findBySql('select coalesce(max(seq),0)+1 as seq from ' . $this->tableName(), array());
return $maxSeq->seq;
}
내가 coalesce
기능이있는 경우 확실하지 않다 최적화 할 수있는 마지막 기능에는 mysql 사용하는 경우 다른 DBMS에서 지원됩니다.
정말로 하시겠습니까? 동시 삽입을 어떻게 다루려고합니까? –
자동 증가를 사용하지 않는 이유는 무엇입니까? 그리고 어떤 dbms를 사용하고 있습니까? – sakhunzai
@TonyHopkinson 트랜잭션 가능한 InnoDB를 사용하고 INSERT 문이 (묵시적 인) 트랜잭션으로 처리되기 때문에 동시 삽입은 문제가되지 않습니다. – porton