2010-12-28 6 views
0

지난 주에 자바 문제에 대한 답변을 얻은 덕분에 DB2에 대한 새로운 문제가 생겼습니다. 웹 양식을 작성하고 DB2 파일 (데이터베이스)에 넣습니다. 자바 PreparedStatement 객체에 전달 된 SQL 문자열 : 여기 DB2 고유 인덱스 및 자동 번호 매기기

insert into EVCRPTFL (
     AUID, URLEX, URNEX, URNAME, URRCPT, URRUN, URRECT, URRECS, URRDYS, URRWKS, URRMHS, URRMTH, URRDAY, URRTHE, URRWHT, URRWDY, UREXPT, UROCRM, UROCRN, UREXPR, URSTTS, URACTV, URRPT, URD1YR, URD1YN, URD1MR, URD1MN, URD1DR, URD1DN, URD2YR, URD2YN, URD2MR, URD2MN, URD2DR, URD2DN, URRPAR, URLANG, URCTRY 
    ) 
    values (
     ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? 
    ) 

는 테이블 작성 스크립트입니다 :

CREATE TABLE EVCRPTFL (
    URID int NOT NULL, 
    AUID decimal(11,0) NOT NULL, 
    URLEX timestamp, 
    URNEX timestamp, 
    URNAME varchar(40) NOT NULL, 
    URRCPT varchar(500) NOT NULL, 
    URRUN timestamp, 
    URRECT char(1) NOT NULL, 
    URRECS int NOT NULL, 
    URRDYS int NOT NULL, 
    URRWKS int NOT NULL, 
    URRMHS int NOT NULL, 
    URRMTH int NOT NULL, 
    URRDAY int NOT NULL, 
    URRTHE int NOT NULL, 
    URRWHT int NOT NULL, 
    URRWDY int NOT NULL, 
    UREXPT int NOT NULL, 
    UROCRM int NOT NULL, 
    UROCRN int NOT NULL, 
    UREXPR timestamp, 
    URSTTS char(1) NOT NULL, 
    URACTV timestamp, 
    URRPT int NOT NULL, 
    URD1YR int, 
    URD1YN int, 
    URD1MR int, 
    URD1MN int, 
    URD1DR int, 
    URD1DN int, 
    URD2YR int, 
    URD2YN int, 
    URD2MR int, 
    URD2MN int, 
    URD2DR int, 
    URD2DN int, 
    URRPAR varchar(1000), 
    URLANG char(2), 
    URCTRY char(2) 
); 

CREATE UNIQUE INDEX EVCRPTFL ON EVCRPTFL(URID); 

당신은, 그것은 제외하고 SQL 문자열의 모든 값을 전달있어 볼 수 있듯이 첫 번째, URID. 레코드가 삽입 된 후 데이터베이스에서 URID를 자동으로 추가한다는 것을 의미하는 ID 번호가있는 데이터베이스에서 볼 수 있습니다 (즉, ID가 Java 코드에서 생성되지 않고 데이터베이스로 전달됨).). 오라클과 PHP에 대한 이전의 경험에서 필자는 자동 시퀀스 필드를 만들기 위해 Oracle Sequences를 사용했으며, MySQL, Postgres 및 기타 데이터베이스 시스템에 광범위하게 유사한 기능이 있음을 알고 있습니다. 자동 번호 매기기는 DB2에서 작동합니다.

DB2에 익숙한 동료는 당황합니다. 그는 그가 본 것에 따라 테이블에 설정된 트리거가 없다고 말합니다. 일반적으로 RPG 코드에서 ID 번호는 데이터베이스에서 생성되지 않고 코드에서 생성 된 다음 데이터베이스로 전달되는 것처럼 들립니다. 그 자체.

내 질문은 : URID의 고유 색인도 ID 번호를 자동 생성합니까, 아니면 데이터베이스 나 Java 코드에서 찾고자하는 다른 것이 있습니까?

내 후속 질문은 다음과 같습니다. 결국 관련 데이터를 저장하는 다른 테이블에 삽입하기 위해 URID 번호를 사용해야 할 것입니다. Oracle에서는 "insert into return into"를 수행 한 다음 코드의 매개 변수화 된 id_variable에서 데이터를 다시 가져옵니다. DB2에도 비슷한 기능이 있습니까? IDENTITY_VAL_LOCAL 함수에 대한 설명서를 찾았지만 IDENTITY_VAL_LOCAL의 첫 번째 삽입과 호출 사이에 웹 양식에서 다른 삽입이 발생하는 경우 항상 올바른 ID를 반환한다고 보장 할 수있는 것처럼 보입니다.

필요한 경우 코드 샘플이나 기타 데이터베이스 정보를 제공 할 수 있습니다. 감사!

+0

IDENTITY_VAL_LOCAL이 연결 범위에 있다는 것을 알게 될 것입니다 ... – kem

+0

@ kem : 마지막으로 사용한 ID (prepareStatement (sql, Statement.RETURN_GENERATED_KEYS))를 반환하는 Java 메소드를 찾았습니다.) 그래서 잠재적 인 경쟁 조건에 대해 걱정할 필요는 없지만 DB2가 자동 번호 매기기를 처리하는 방법에 대해서는 여전히 궁금합니다. 모든 SQL 구현이 다르게 수행하는 것처럼 보입니다. "표준에 대한 좋은 점은 선택할 수있는 것이 많다는 것입니다."라고 생각합니다. – Sam

답변

0

URID의 고유 색인이 ID 번호를 자동으로 생성하지 않습니다. 이 GENERATED BY DEFAULT

URID int NOT NULL 
    GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1) 
    UNIQUE 

당신이 그것을 필요로하는 경우에 사용자 정의 값을 지정하게됩니다 :

이 작업을 수행하는 DB2의 방법은이이 GENERATED BY DEFAULT 또는 URID 열 정의에 항상 GENERATED 추가하는 것입니다.

CREATE TABLE 문에 대한 설명서를 살펴 보는 것이 좋습니다.

+0

DB2 문서에서 DEFAULT/DIVAULT/ALWAYS를 볼 수 있었지만 목록에있는 테이블 작성 문에서 볼 수 없었습니다. 위 테이블에서이 테이블을 사용하지 않았다는 가정하에 작동했습니다 ... 가치가있는 것을 위해 JDBC ODBC 브리지와 함께 SQuirreL SQL 클라이언트를 사용하고 있습니다. 정확히 어떤 테이블이 만들어 졌는지.DB2가 사용할 수있는 자동 번호 매기기의 다른 소스가 있습니까? – Sam

+0

소개 된 DB2의 버전이 확실하지 않지만 시퀀스를 사용할 수도 있습니다. CREATE SEQUENCE (http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/topic/com.ibm.db2z10.doc.sqlref/db2z_sql_createsequence.htm)에 대한 문서에는 몇 가지 예제가 있습니다. – Leons