Автоинкремент в Oracle, не используя триггер

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

22
задан Ben 7 July 2013 в 11:33
поделиться

8 ответов

Насколько я могу вспомнить со своих дней Oracle, Вы не можете достигнуть Столбцов автоприращения, не используя ТРИГГЕР. Любые решения там для создания столбца автоприращения включают ТРИГГЕР и ПОСЛЕДОВАТЕЛЬНОСТЬ (я предполагаю, что Вы уже знаете это, следовательно никакие триггерные комментарии).

3
ответ дан Salamander2007 29 November 2019 в 04:33
поделиться

Если Вам не нужны порядковые номера, но только уникальный идентификатор, можно использовать ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ SYS_GUID (). Т.е.:

CREATE TABLE xxx ( ID RAW(16) DEFAULT SYS_GUID() )
16
ответ дан angus 29 November 2019 в 04:33
поделиться

Можно создать и использовать последовательности оракула. Синтаксис и детали в , http://www.techonthenet.com/oracle/sequences.php

Также читает статью http://rnyb2.blogspot.com/2006/02/potential-pitfall-with-oracle-sequence.html для понимания ограничений относительно АВТОМАТИЧЕСКОГО НОМЕРА в другом RDBMS

18
ответ дан Dheer 29 November 2019 в 04:33
поделиться

Триггер для получения следующего значения из последовательности является наиболее распространенным способом достигнуть эквивалента АВТОИНКРЕМЕНТУ:

create trigger mytable_trg
before insert on mytable
for each row
when (new.id is null)
begin
    select myseq.nextval into :new.id from dual;
end;

Вам не нужен триггер при управлении вставками - просто используют последовательность в операторе вставки:

insert into mytable (id, data) values (myseq.nextval, 'x');

Это могло быть скрыто в пакете API, так, чтобы вызывающая сторона не должна была ссылаться на последовательность:

mytable_pkg.insert_row (p_data => 'x');

, Но использование триггера более "прозрачно".

11
ответ дан Tony Andrews 29 November 2019 в 04:33
поделиться

Создайте последовательность:

create sequence seq;

Затем для добавления значения

insert into table (id, other1, other2)
values (seq.nextval, 'hello', 'world');

Примечание: Ищите документы оракула для большего количества опций о последовательностях (запустите значение, инкремент...)

2
ответ дан FerranB 29 November 2019 в 04:33
поделиться
SELECT max (id) + 1 
FROM   table
-8
ответ дан Alex 29 November 2019 в 04:33
поделиться

Помимо, например, Ответ FerranB:
Вероятно, стоит упомянуть, что, в отличие от того, как auto_incement работает в MySQL:

  • последовательности работают во всей базе данных, поэтому их можно использовать для нескольких таблиц, а значения уникальны для вся база данных
  • поэтому: усечение таблицы не сбрасывает функцию «автоинкремента»
  • 0
    ответ дан 29 November 2019 в 04:33
    поделиться

    Если вы не хотите использовать "триггерное" решение, вы можете добиться функциональности автоинкремента программным способом, получив значение клавиши автоинкремента с помощью метода getGeneratedKeys().

    Вот фрагмент кода для вашего рассмотрения:

    Statement stmt = null;
    ResultSet rs = null;
    
    stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                                    java.sql.ResultSet.CONCUR_UPDATABLE);
    
    stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTable");
    
    stmt.executeUpdate("CREATE TABLE autoIncTable ("
                    + "priKey INT NOT NULL AUTO_INCREMENT, "
                    + "dataField VARCHAR(64), PRIMARY KEY (priKey))");
    
    stmt.executeUpdate("INSERT INTO autoIncTable  (dataField) "
                    + "values ('data field value')",
                    Statement.RETURN_GENERATED_KEYS);
    
    int autoIncKeyFromApi = -1;
    
    rs = stmt.getGeneratedKeys();
    
    if (rs.next()) {
        autoIncKeyFromApi = rs.getInt(1);
    }
    else {
        // do stuff here        
    }
    
    rs.close();
    

    источник: http://forums.oracle.com/forums/thread.jspa?messageID=3368856

    0
    ответ дан 29 November 2019 в 04:33
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: