2013-10-20 4 views
0

seq은 DB 테이블의 정수 열입니다. 새 레코드를 만들 때만 SQL 열 수정

나는 새 레코드를 만드는 SQL에 seq=MAX(seq)+1 할 것입니다 및 업데이트에 기존 레코드를 seq 열을 수정할 수 없습니다 것 CActiveRecord 파생 클래스를 원한다.

어떻게?

+0

정말로 하시겠습니까? 동시 삽입을 어떻게 다루려고합니까? –

+0

자동 증가를 사용하지 않는 이유는 무엇입니까? 그리고 어떤 dbms를 사용하고 있습니까? – sakhunzai

+0

@TonyHopkinson 트랜잭션 가능한 InnoDB를 사용하고 INSERT 문이 (묵시적 인) 트랜잭션으로 처리되기 때문에 동시 삽입은 문제가되지 않습니다. – porton

답변

0

전체 비즈니스 로직이 명확하지만, 어떻게 든 위의 논의를하지 않기 때문에이 솔루션이 될 수 :

원하는 모델 클래스에 두 가지 기능을 다음과 같은 추가하고 작업이 완료!

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에서 지원됩니다.

관련 문제