2015-10-07 2 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

См. [** Первичный ключ автоинкремент в выпусках до 12c (функция идентификации **)] (http://lalitkumarb.com/2015/01/20/auto-increment-primary-key-in-pre-12c- release-идентификация-функциональность /) и функциональность [** 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, а база данных разбилась, следующая next будет равна 101. Это кеширование будет отличаться по размеру в зависимости от вашего использования, однако более одновременные транзакции, которые вы ожидаете, будут больше. –

0

Oracle 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 

Oracle создает 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 

Для предварительно 12с релизов см Auto-increment primary key in Pre 12c releases (Identity functionality)

Смежные вопросы