好吧,說我有一個兩列的表。 Entry_id和名稱。 Entry_id是一個ROWID NOT NULL。 本質上我只是希望它每增加一次新的東西就會增加。我如何在PreparedStatement中執行此操作。我不會知道正確的Entry_id BC沒關係。它應該每次都增加。所以,如果我可以將名稱插入表中並自動增加entry_id,那將會很好。任何想法如何做到這一點?使用java在oracle數據庫中自動增加RowID
2
A
回答
8
ROWID是表中某一行的物理地址。將ROWID用作鍵是沒有意義的 - 如果將表從一個表空間移動到另一個表空間,如果執行導出和導入操作,發生行移動等,則ROWID將隨時間而改變。而且它不會因爲結果很可能無效,因爲它不再是實際行的物理地址,或者它不再是有效的物理地址,因此增加ROWID是有意義的。
如果您希望在Oracle中使用自動遞增主鍵,則需要將列聲明爲NUMBER而不是ROWID。然後,您可以創建一個序列對象
CREATE SEQUENCE entry_id_seq
START WITH 1
INCREMENT BY 1
CACHE 100;
,並引用該序列的NEXTVAL
在INSERT
聲明
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
我使用的關鍵字「甲骨文」和「自動遞增」的臺詞數據庫。發現這個:http://situsnya.wordpress.com/2008/09/02/how-to-create-auto-increment-columns-in-oracle/
通過將觸發器與序列結合使用,不需要將oracle特定的構造包含到插入中,只需將entry_id的值從insert中的顯式值列表中移出。
因此,先在我的數據庫中創建一個序列,然後執行該操作? – auwall 2011-05-18 15:27:11
是的 - Justin Cave的答案似乎給出了一個非常好的例子。 – DaveH 2011-05-18 15:29:44