2017-10-27 22 views
0

제 문제는 쉽게 이해할 수 있으며 여기서는 Doctrine 문서에 대한 참조와 함께 Stackoverflow에서 언급 한 내용이 많습니다.IBM DB2 + Doctrine - 복합 기본 키의 자동 증가

복합 키가있는 모든 엔티티는 이외의 ID 생성기를 '할당 됨'으로 사용할 수 없습니다. 즉, EntityManager # persist ($ entity)를 호출하기 전에 ID 필드의 값이 이어야합니다.

마지막으로 생성 된 ID를 가져 와서 값에 +1을 추가하고 엔티티를 지속했습니다. 문제는 동일한 IBM DB2 데이터베이스를 사용하는 타사 소프트웨어가 행을 추가 할 수 없다는 것입니다. 왜냐하면 자동 증가 인덱스가 행을 그런 식으로 삽입 할 때 업데이트되지 않기 때문입니다.

이 작업을 수행하는 방법이나 테이블 자동 증가 인덱스를 업데이트하는 방법이 있습니까?

미리 감사드립니다. 당신이 더 나는/원하는 달성하기 위해 무엇을 이해하는 데 도움이하기 위해

편집

, 난 당신에게 내 예를 보여줍니다.

하는 EntityClass

class Entity 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="string", name="serie") 
    */ 
    protected $serie; 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer", name="reference") 
    * @ORM\GeneratedValue 
    */ 
    protected $reference; 
    // More code... 
} 

여러 개의 기본 키는 교리에 의해 허용하지만이 기업이 방법

$entity = new Entity(); 
$entity->set("serie", date('Y')); // Custom setter that search the property and sets the value. In this case, current year as string 
// More assignements, except for the autoincrement value 
$em->persist($entity); 
$em->flush(); 

을 채울 때 어떤 이유로, 그것은 ID 중 하나가 없다는 예외가 발생하고 있습니다 채워지지 않고 반드시 복합 키 엔티티에 채워 져야하지만 자동 증가 열이며 그 방식으로 작동하게해야합니다. 다음 자동 증분 값을 얻거나 테이블의 자동 증분 값을 업데이트하는 방법을 찾아야합니다. IBM DB2. 그렇지 않은 경우 자동 증가 열의 최대 값을 얻은 경우 다른 타사 소프트웨어가 중단되고 해당 값이 1 씩 증가하고 엔티티에 수동으로 할당됩니다.

쿼리 : 어떤 추가 정보가 필요하면

SELECT presence FROM DB2ADMIN.PRESENCES WHERE serie LIKE 2017 ORDER BY presence DESC FETCH FIRST 1 ROWS ONLY; 

알려주세요.

+0

"자동 생성 된"부분이 나머지 key_를 반복하는 복합 키를 가지고있을 때 주로 사용한다고 생각합니다. 즉,'(keyColumnAValueA, 0)'와'(keyColumnAValueB, 0)'모두 유효합니다. 내가 아는 데이터베이스는 자동 생성되지 않을 것입니다. 자동 생성 된 키는 완전히 다른 것으로 간주됩니다. 다른 키를위한 스탠드이며 값 자체는 의미가 없습니다. 반복되는 값은 값에 의미가 있음을 나타냅니다. 그럼이 신분증은 무엇입니까? –

+0

@ Clockwork-Muse 귀하의 의견에 감사드립니다. 나는 너를 전혀 따라하지 않는다. 어쩌면 나는 복합 키에 대해 이야기 할 때 또는 실수로 당신이 말하는 것에 대해 이해하지 못한다고 생각합니다. 미안 해요. (내 질문을 업데이트하여 내가 원하는 것을 더 잘 볼 수 있습니다. – DaGLiMiOuX

+0

좋아요 ... '$ reference'의 값을 전체 테이블에 대해 유일하게하거나'$ serie'에 대해 고유하게 하시겠습니까? –

답변

1

, 나는 그들 중 하나를하지 않는 것이 좋습니다가이 작업을 수행하는 두 가지 방법,하지만 당신이 거래에 액세스 할 수 없기 때문에 (그리고 분명히 차이에 대해 걱정하지 않는다).

난 당신이 사용하지 추천하고있어 첫 번째 방법은, 그 증가하고, 반환, 생성 된 값을 저장할 테이블을 만드는 것입니다. I previously answered a question about this for SQL Server이지만 개념을 번역해야합니다. 트리거에서 값을 생성 할 수 없기 때문에 일부 유틸리티는 손실되지만 여전히 작동해야합니다. 가장 중요한 문제는 테이블이 병목 현상을 나타내며 많은 이점을 얻지 못한다는 것입니다.

두 번째 방법은 매년 별도의 SEQUENCE을 사용하는 것입니다. 이것은 매년 객체를 생성해야하지만, 숫자를 얻는 것이 훨씬 빠르다는 점에서 다소 문제가 있습니다. 근본적으로 틈이있을 수도 있습니다.난 항상 값이 증가하고 간격이 허용 특히, 값을 가지고, 기본 키의 약간의 의심 해요


참고.

+0

감사합니다. DB를 살펴본 후 타사 소프트웨어에는 "카운터"라는 테이블이 있습니다. 테이블의 ID를 참조합니다. 그 테이블의 참조 만 업데이트하면됩니다. 이제 그것은 매력처럼 작동합니다. 시간 내 줘서 고마워 – DaGLiMiOuX