2012-10-19 62 views
0

我想將新值插入到Oracle表中。該表格非常大,ID代碼以數字形式存儲。我想寫插入語句,可以添加我的新信息,並自動分配一個ID尚未採取。SQL增量ID分配

例如:

insert into example_table values 
(
(select max(person_id)+1 from example_table), 
99, 'example name', 'example type'); 

但是這上面的代碼顯然不會工作,因爲我指定一個ID(99)。如果我在上面的代碼片段中將99設置爲null,它會起作用嗎?不知道如何格式化。

謝謝。

回答

1

您可以通過在數據庫表上定義一個序列和觸發器來實現。 該序列將簡單地按順序出售ID。當行被插入的觸發條件會,並要求順序下一個可用的ID,它將然後放入表你..這樣一來,傳遞NULL將工作確定..

CREATE SEQUENCE YOUR_SCHEMA_NAME.IDSEQ 
    START WITH 9988 
    MAXVALUE 999999999999999999999999999 
    MINVALUE 1 
    NOCYCLE 
    NOCACHE 
    NOORDER; 

CREATE OR REPLACE TRIGGER YOUR_SCHEMA_NAME.YOUR_TABLE_NAME_bir 
BEFORE INSERT 
ON YOUR_SCHEMA_NAME.YOUR_TABLE_NAME REFERENCING NEW AS NEW 
FOR EACH ROW 

BEGIN 

    -- Custom code to: generate primary key from idseq if no id is passed 

    IF :NEW.id IS NULL THEN 
    :NEW.id := idseq.NEXTVAL; 
    END IF; 

EXCEPTION 
    WHEN OTHERS THEN 
    raise_application_error(-20570, 'System error: ' || SQLCODE || ':' || SQLERRM, TRUE); 
END; 
/
+0

我試圖在測試環境中刪除99運行(不替換爲null),它工作得很好。謝謝回覆。 :) – GrumP

+1

啊,我把它的表只有3列呢?在這種情況下,在你上面的例子中,你試圖插入4.你的'select max(person_id)+1 from example_table)'基本上是爲你的觸發+序列的工作。雖然這是可以的,但它可能不是非常高效,因爲select可能會隨着表的增長而開始佔用越來越多的時間..在這種情況下使用序列+觸發器肯定是更好的選擇...很高興幫助:) – StevieG

3

這是錯誤的方法。它不能擴展,並且在多用戶環境下不起作用。

顯然,Oracle 12c將像MSSQL一樣提供AUTOINCREMENT功能。與此同時,您需要創建一個序列並使用它。

insert into example_table 
values (person_id_seq.nextval, 'example name', 'example type') 

Find out more.

+0

這實際上很聰明,會考慮它在未來。感謝您提供有用的信息。 – GrumP