Автоматическое увеличение RowID в базе данных оракула с использованием Java - PullRequest
2 голосов
/ 18 мая 2011

Хорошо, скажите, что у меня есть таблица с двумя столбцами. Entry_id и имя. Entry_id - это ROWID, а не NULL. По сути, я просто хочу, чтобы он увеличивался каждый раз, когда вводится что-то новое. Как это сделать в PreparedStatement. Я не буду знать правильный Entry_id, это не имеет значения. Это должно просто увеличиваться каждый раз. Так что было бы хорошо, если бы я мог просто вставить имя в таблицу и автоматически увеличить entry_id. Есть идеи как это сделать?

Ответы [ 3 ]

8 голосов
/ 18 мая 2011

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 );

Конечно, вы можете создать пред вставкутриггер для заполнения первичного ключа из последовательности

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 голосов
/ 18 мая 2011

Если вы удовлетворены зависимым от базы данных способом сделать это, тогда обычный подход заключается в использовании последовательности оракула .

После того, как вы создадите последовательность, которая живет в базе данных, ваш код будет иметь вид

p = conn.prepareStatement("insert into mytable (entry_id, name) values (mysequence.next_val,?)");
p.setString(1,"My Name");
p.executeUpdate();
0 голосов
/ 18 мая 2011

Я использовал ключевые слова «оракул» и «автоинкремент».Найдено: http://situsnya.wordpress.com/2008/09/02/how-to-create-auto-increment-columns-in-oracle/

Используя триггер в сочетании с последовательностью, вам не нужно включать специфичные для оракула конструкции в вашу вставку, вы просто оставляете значение entry_id из явного списка значенийво вставке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...