다른 열의 값 (esercizio)에 대해 하나의 테이블에 다른 시퀀스가 필요합니다.오라클 하나의 테이블에 여러 시퀀스
나는 이렇게하지만 동적 생성 및 시퀀스의 사용은 아닙니다. 어떻게 문제를 추상화 할 수 있습니까?
CREATE TABLE Z_TEST ( ID NUMBER, ESERCIZIO NUMBER, DESCRIZIONE VARCHAR2 (200 BYTE) ) LOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING; ALTER TABLE Z_TEST ADD ( CONSTRAINT Z_TEST_PK PRIMARY KEY (ID, ESERCIZIO)); CREATE SEQUENCE Z_TEST_SEQ_2010 START WITH 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER; CREATE SEQUENCE Z_TEST_SEQ_2011 START WITH 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER; CREATE SEQUENCE Z_TEST_SEQ_2012 START WITH 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER; CREATE SEQUENCE Z_TEST_SEQ_2013 START WITH 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER; CREATE SEQUENCE Z_TEST_SEQ_2014 START WITH 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER; CREATE SEQUENCE Z_TEST_SEQ_2015 START WITH 1 MAXVALUE 999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER; CREATE OR REPLACE TRIGGER Z_TEST_TRG BEFORE INSERT ON Z_TEST REFERENCING new AS New old AS Old FOR EACH ROW DECLARE err_code NUMBER; err_msg VARCHAR2 (200); BEGIN if :new.esercizio = 2010 then select Z_TEST_SEQ_2010.nextval into :new.ID from dual; end if; if :new.esercizio = 2011 then select Z_TEST_SEQ_2011.nextval into :new.ID from dual; end if; if :new.esercizio = 2012 then select Z_TEST_SEQ_2012.nextval into :new.ID from dual; end if; if :new.esercizio = 2013 then select Z_TEST_SEQ_2013.nextval into :new.ID from dual; end if; if :new.esercizio = 2014 then select Z_TEST_SEQ_2014.nextval into :new.ID from dual; end if; if :new.esercizio = 2015 then select Z_TEST_SEQ_2015.nextval into :new.ID from dual; end if; EXCEPTION WHEN OTHERS THEN err_msg := SUBSTR (SQLERRM, 1, 200); err_code := SQLCODE; DBMS_OUTPUT.put_line ('errore: ' || err_code || ' ' || err_msg); END; /
당신은 무엇을 의미합니까? 2016로 레코드를 얻기 전에 수동으로 새 시퀀스를 만들고 트리거를 변경하지 않아도되고 싶습니까? ID가 그 값에 따라 달라야하는 이유는 ID 자체가 고유하지 않으므로 기본 키가 될 수 없다는 것을 의미합니다. 따라서 그 이유는 무엇이며, 왜 단일 시퀀스를 사용하여 그 값을 채울 수 없습니까? 기둥? –
나는 자신의 자치 번호가있는 액세스 권한이있는 많은 오래된 데이터베이스를 가지고 있지만 다른 테이블 참조는 1 년 동안 데이터베이스가 1 개 있습니다. – Albo
두 부분으로 구성된 기본 키는'ID, ESERCIZIO'보다는'ESERCIZIO, ID' 여야한다고 생각합니다. 그런 다음 시퀀스의 틈새에 신경 쓰지 않는다면 동일한 시퀀스가 모든 ID 값에 사용될 수 있습니다. 갭을 가질 수없는 이유가 있습니까? – Glenn