我們正在將應用程序從Oracle移至DB2。這是一項批量工作。有加工前分配ID條目的順序邏輯:序列DB2中的預留序列範圍
選擇MY_SEQUENCE.nextval的
預訂範圍; // range_start;
改變序列MY_SEQUENCE增加RANGE_SIZE;
select MY_SEQUENCE.nextval;
改變序列MY_SEQUENCE增加1;
select MY_SEQUENCE.nextval; // range_end;從範圍內,通過內存增加值
分配ID:
爲ID = RANGE_START:RANGE_END做
這在甲骨文工作得很好,但給了在DB2意想不到的結果。
在Oracle:
DROP SEQUENCE MY_SEQUENCE;
CREATE SEQUENCE MY_SEQUENCE MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 50000 NOORDER NOCYCLE ;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 1;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 2;
ALTER SEQUENCE MY_SEQUENCE INCREMENT BY 100000;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 100002;
ALTER SEQUENCE MY_SEQUENCE INCREMENT BY 1;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 100003;
在DB2:
DROP SEQUENCE MY_SEQUENCE;
CREATE SEQUENCE MY_SEQUENCE AS DECIMAL(27 , 0) START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 999999999999999999999999999 NO CYCLE CACHE 50000 NO ORDER;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 1;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 2;
ALTER SEQUENCE MY_SEQUENCE INCREMENT BY 100000;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 150000;
ALTER SEQUENCE MY_SEQUENCE INCREMENT BY 1;
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 5000050001;
我認爲150000可以通過緩存大小來解釋。不過,我還不知道5000050001的價值。這裏的任何幫助都非常感謝。
注:
- 林意識到ALTER語句被非事務性的。但是,該進程在啓動時獨佔訪問數據庫,並運行非分佈式和單線程。
- DB2以ORA兼容模式運行
- 如果使用DB2序列下一個val,則會出現DB2中的相同問題:VALUES NEXT VALUE FOR MY_SEQUENCE;
- 有序序列相同的問題
我認爲這是您的流程的一部分,這意味着這個流程首先是有缺陷的。 'ALTER'應該是_rare_,通常是一次性的語句。你到底在做什麼跳躍範圍? Autogen id值不應該影響(通常)。這表明你有某種多部分的關鍵,這違反了良好的規範化實踐。如果你真的需要做這樣的事情,我會使用2個序列 - 一個每次跳過100000個,一個跳過'1'(或者看看ROW_NUMBER()是否給出了合理的結果) 。 – 2014-12-02 10:30:59
但是我需要'改變'來在我的過程結束後同步序列,對嗎? – Denis 2014-12-02 11:15:22
是的,你仍然需要重置下一批作業的序列(我可能會建議在下一次開始時使用)。但我仍然認爲你這樣做的事實意味着你的設計或實施過程很差。如果這是爲了追蹤目的,只需使用一個自動識別號。據推測,每個較大的跳躍信號應該是父表的一部分,而小的表是子表的一部分... – 2014-12-02 11:31:36