2014-12-19 75 views
0

我想知道在創建表格並且已經插入了相當多的數據之後,如果您想要創建一個序列,結果是什麼。創建表格後很長時間創建觸發器

this is because PEAR's DataObject's insert() method sometimes skips incremental IDs

因此,這裏是實現這一目標的例子,但這是時間量過去之後做的,如果正確的方法是什麼?

表定義:

CREATE TABLE departments (
    ID   NUMBER(10) NOT NULL, 
    DESCRIPTION VARCHAR2(50) NOT NULL); 

ALTER TABLE departments ADD (
    CONSTRAINT dept_pk PRIMARY KEY (ID)); 

CREATE SEQUENCE dept_seq; 

觸發定義:

CREATE OR REPLACE TRIGGER dept_bir 
BEFORE INSERT ON departments 
FOR EACH ROW 

BEGIN 
    SELECT dept_seq.NEXTVAL 
    INTO :new.id 
    FROM dual; 
END; 

回答

3

如果你的意思是你已經有插入,而不使用觸發器ID現場數據,您將有唯一要檢查是你的序列的「開始」=至少是現有的最大ID + 1

CREATE SEQUENCE dept_seq 
START WITH  2503 
INCREMENT BY 1 

那麼它應該是非常好的。

1

這是因爲PEAR的數據對象的insert()方法有時跳過增量的ID

爲補充拉斐爾奧爾索斯的答案,使用序列不會無論如何保證你沒有ID中的「孔」。考慮併發訪問,或回滾

引述the documentation

當產生一個序列號,該序列被遞增,獨立提交或回滾事務的。如果兩個用戶同時遞增相同的序列,則每個用戶獲取的序列號可能有間隙,因爲序列號是由另一個用戶生成的。

有一個有趣的回答同一個問題上Asktom

序列將永遠不會生成數字的無間隙序列。

[...]

你不應該在一個序列生成什麼,甚至接近數字的無間隙 順序計數。它們是一種高速,高度可擴展的多用戶方式,可爲 生成表格的替代鍵。

連續的數字序列幾乎是不可能的 與序列(只需要一個回滾 - 這些將發生)。

+0

如果我可以在你們之間劃分正確的答案,我會。無論如何,謝謝你的貢獻和讚賞。 – morne 2014-12-19 11:21:52