2015-10-07 68 views
1

我試圖啓動一個序列,它在插入完成後自動填充列。它應該從500開始,然後遞增1.任何想法我會如何去做這件事?到目前爲止,我有這樣的事情,但它似乎崩潰使用觸發器自動填充列SQL

CREATE TRIGGER ADD_TRIGGER ON tablename 
AFTER INSERT 
AS 
BEGIN 
    ADD colname NUMBER IDENTITY(500,1); 
END 
GO 
+0

升級到Oracle 12.1+和使用'identity'。 –

+0

請參閱[Pre-12c發行版中的自動遞增主鍵(身份功能**)](http://lalitkumarb.com/2015/01/20/auto-increment-primary-key-in-pre-12c-發佈 - 身份 - 功能/)和[** IDENTITY列自動增量功能在Oracle 12c **中](http://lalitkumarb.com/2015/01/20/identity-column-autoincrement-functionality-in-oracle-12c/ )。 –

回答

1

您可以創建一個序列

CREATE SEQUENCE mySeq 
    START WITH 500 
    INCREMENT BY 1 
    CACHE 100; 

,然後在你的觸發器使用它

CREATE OR REPLACE TRIGGER myTrigger 
    AFTER INSERT ON table_name 
    FOR EACH ROW 
BEGIN 
    SELECT mySeq.nextval 
    INTO :new.colname 
    FROM dual; 
END; 
+0

什麼是雙重?什麼是CACHE? – Josh123

+2

dual是一個特殊表:http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries009.htm緩存選項用於以塊的形式預先分配值。如果序列1-10被髮布並且數據庫崩潰,nextval將會是101.這個緩存的大小會根據您的使用而有所不同,但是您預期的同時發生的事務數量會更多。 –

0

甲骨文12C介紹IDENTITY COLUMNS

SQL> CREATE TABLE new_identity_table 
    2 (
    3  ID NUMBER GENERATED ALWAYS AS IDENTITY, 
    4  text VARCHAR2(50) 
    5 ); 

Table created. 

SQL> 
SQL> INSERT 
    2 INTO new_identity_table 
    3 (
    4  text 
    5 ) 
    6 VALUES 
    7 (
    8  'This table has an identity column' 
    9 ); 

1 row created. 

SQL> column text format A40; 
SQL> 
SQL> select * from new_identity_table; 

     ID TEXT 
---------- ---------------------------------------- 
     1 This table has an identity column 

甲骨文將創建一個sequence填充identity column。你可以找到它命名爲ISEQ$$

SQL> select sequence_name, min_value, max_value, increment_by from user_sequences; 

SEQUENCE_NAME   MIN_VALUE MAX_VALUE      INCREMENT_BY 
-------------------- ---------- ---------------------------- ------------ 
ISEQ$$_93199     1 9999999999999999999999999999 1 

更多關於身份列的詳細信息,請使用ALL_TAB_IDENTITY_COLS視圖。

SQL> SELECT table_name, 
    2   column_name, 
    3   generation_type, 
    4   identity_options 
    5 FROM all_tab_identity_cols 
    6 WHERE owner = 'LALIT' 
    7 ORDER BY 1, 2; 

TABLE_NAME   COLUMN_NAME  GENERATION IDENTITY_OPTIONS 
-------------------- --------------- ---------- -------------------------------------------------- 
NEW_IDENTITY_TABLE ID    ALWAYS  START WITH: 1, INCREMENT BY: 1, MAX_VALUE: 9999999 
               999999999999999999999, MIN_VALUE: 1, CYCLE_FLAG: N 
               , CACHE_SIZE: 20, ORDER_FLAG: N 

對於預12C版本,請參閱Auto-increment primary key in Pre 12c releases (Identity functionality)