2011-05-18 76 views
2

好吧,說我有一個兩列的表。 Entry_id和名稱。 Entry_id是一個ROWID NOT NULL。 本質上我只是希望它每增加一次新的東西就會增加。我如何在PreparedStatement中執行此操作。我不會知道正確的Entry_id BC沒關係。它應該每次都增加。所以,如果我可以將名稱插入表中並自動增加entry_id,那將會很好。任何想法如何做到這一點?使用java在oracle數據庫中自動增加RowID

回答

8

ROWID是表中某一行的物理地址。將ROWID用作鍵是沒有意義的 - 如果將表從一個表空間移動到另一個表空間,如果執行導出和導入操作,發生行移動等,則ROWID將隨時間而改變。而且它不會因爲結果很可能無效,因爲它不再是實際行的物理地址,或者它不再是有效的物理地址,因此增加ROWID是有意義的。

如果您希望在Oracle中使用自動遞增主鍵,則需要將列聲明爲NUMBER而不是ROWID。然後,您可以創建一個序列對象

CREATE SEQUENCE entry_id_seq 
    START WITH 1 
    INCREMENT BY 1 
    CACHE 100; 

,並引用該序列的NEXTVALINSERT聲明

INSERT INTO entry(entry_id, name) 
    VALUES(entry_id_seq.nextval, :1); 

當然,你可以創建一個之前,INSERT觸發器來填充來自主鍵序列

CREATE OR REPLACE TRIGGER get_entry_id 
    BEFORE INSERT ON entry 
    FOR EACH ROW 
IS 
BEGIN 
    SELECT entry_id_seq.nextval 
    INTO :new.entry_id 
    FROM dual; 
END; 

INSERT語句可以再省略ENTRY_ID列,讓觸發器會自動填充它。

INSERT INTO entry(name) 
    VALUES(:1); 
3

如果您對使用數據庫進行此操作的方式感到滿意,那麼通常的做法是使用oracle sequence

後創建序列,它生活在你的代碼將沿

p = conn.prepareStatement("insert into mytable (entry_id, name) values (mysequence.next_val,?)"); 
p.setString(1,"My Name"); 
p.executeUpdate(); 
+0

因此,先在我的數據庫中創建一個序列,然後執行該操作? – auwall 2011-05-18 15:27:11

+0

是的 - Justin Cave的答案似乎給出了一個非常好的例子。 – DaveH 2011-05-18 15:29:44