2015-05-14 4 views
1

У меня есть таблица оракула с уникальным столбцом id. Когда я вставляю данные в таблицу, я увеличиваю число последних id.Получите уникальный идентификатор, полученный при вставке в таблицу базы данных

insert into my_table vlaues((select max(id) from my_table), 'etc', 'etc'); 

Может быть несколько процессов, которые записывают в эту таблицу одновременно.

Автообнос on.

В этой таблице нет другой уникальной колонки, кроме id.

Когда я вставляю запись в таблицу, есть ли способ получить значение id, полученное после ввода записи?

Как я могу видеть, если я использую select max(id) from my_table после вставки, я не могу получить идентификатор, используемый в инструкции вставки, поскольку кто-то еще мог вставить еще одну запись, прежде чем я выпущу select.

+0

Это не безопасный способ иметь автоинкрементные идентификаторы - одновременный доступ приведет к дублированию идентификаторов (возможно, приведет к уникальным нарушениям ключа). – Luaan

+0

Возможный дубликат [Autoincrement in oracle to уже созданная таблица] (http://stackoverflow.com/questions/28037303/autoincrement-in-oracle-to-already-created-table) –

+0

Также ознакомьтесь с функциональностью автоинкремента колонки IDENTITY в Oracle 12c] (http://lalitkumarb.wordpress.com/2015/01/20/identity-column-autoincrement-functionality-in-oracle-12c/) и [Первичный ключ с автоматическим инкрементом в выпусках Pre 12c] (http: //lalitkumarb.wordpress.com/2015/01/20/auto-increment-primary-key-in-pre-12c-releases-identity-functionality/) –

ответ

4

Oracle 12, наконец, имеет встроенные столбцы идентификации. Итак, если вы используете самую последнюю версию Oracle, вы можете просто использовать ее. Читайте об этом here.

В более ранних версиях лучше всего использовать последовательность. Это гарантирует уникальность даже в многопоточной среде. Я всегда использую триггеры для обновления столбца id. Here - ответ на аналогичный вопрос, объясняющий, как это сделать.

+0

Я прочитал ваше решение, используя последовательность, но неясно, как я могу получить значение, используемое для столбца «id» при вставке записи. Есть идеи? –

+0

@ LahiruChandima Почему вы не используете триггер? – Moudiz

+0

@Moudiz Я не знаком с триггерами. Я рассмотрю триггеры, если они могут быть использованы для этого. –

2

Вы можете попробовать это:

CREATE TABLE myTable(ID RAW(16) DEFAULT SYS_GUID()) 

Также предпочтительно использовать Sequence, чтобы получить автоматическое приращение идентификатора.

Если вы хотите получить идентификатор последовательности после вставки вы можете попробовать, как это:

declare 
x number; 
id number; 
begin 
x := your_sequence.nextval; 
insert into mytable (column1, column2, column3) 
values (x, value2, value3) returning x into id; 

dbms_output.put_line(to_char(id)); 
end; 
+0

@ Lahiru Chandima: - В чем проблема с синтаксисом 'return'? –

0

Лучше всего использовать последовательности в этом сценарии (хотя вы можете в конечном итоге с пробелами в цифрах). Вы можете получить их текущие/следующие значения, используя seq_abc1.currval/nextval.

+0

Должны быть пробелы, и обычно в них нет ничего плохого. Без пробелов одна транзакция должна была бы подождать, пока другие коммиты (откатываются назад), поэтому вся система не будет хорошо масштабироваться. – ibre5041

+0

Правда, я должен был сказать «воля», а не «может», – Shepherdess

0

Когда я вставляю запись в таблицу, есть ли способ получить значение идентификатора, полученное после ввода этой записи?

Просто используйте пункт RETURNING.

Например -

RETURNING identity_id INTO variable_id; 

тест случае -

SQL> set serveroutput on 
SQL> CREATE TABLE t 
    2 (ID NUMBER GENERATED ALWAYS AS IDENTITY, text VARCHAR2(50) 
    3 ); 

Table created. 

SQL> 
SQL> DECLARE 
    2 var_id NUMBER; 
    3 BEGIN 
    4 INSERT INTO t 
    5  (text 
    6  ) VALUES 
    7  ('test' 
    8  ) RETURNING ID INTO var_id; 
    9 DBMS_OUTPUT.PUT_LINE('ID returned is = '||var_id); 
10 END; 
11/
ID returned is = 1 

PL/SQL procedure successfully completed. 

SQL> 

SQL> select * from t; 

     ID TEXT 
---------- -------------------------------------------- 
     1 test 

SQL> 

Вы можете использовать тот же метод ВОЗВРАЩЕНИЕ для предварительного 12с релиза тоже, где у вас нет IDENTITY колонок. Возвращаемое предложение вернет значения, которые вы вставляете в таблицу.

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