2012-10-19 5 views
0

Я хочу вставить новые значения в таблицу Oracle. Таблица довольно велика, и идентификационные коды хранятся в виде чисел. Я бы хотел написать инструкции вставки, которые могут добавить мою новую информацию и автоматически назначить идентификатор, который еще не был выполнен.SQL-инкрементное присвоение идентификатора

Например:

insert into example_table values 
(
(select max(person_id)+1 from example_table), 
99, 'example name', 'example type'); 

Но этот код выше, очевидно, не будет работать, потому что я указать идентификатор (99). Если я установил 99 в null в приведенном выше фрагменте кода, будет ли он работать? Не знаете, как форматировать.

Спасибо.

ответ

1

вы можете сделать это, указав последовательность и триггер в таблице базы данных. Последовательность будет просто идентификатором поставщика в последовательном порядке. Триггер будет срабатывать, когда вставляется строка и задать последовательность для следующего доступного идентификатора, который будет затем положить в таблицу для вас .. Таким образом, передавая NULL будет работать нормально ..

CREATE SEQUENCE YOUR_SCHEMA_NAME.IDSEQ 
    START WITH 9988 
    MAXVALUE 999999999999999999999999999 
    MINVALUE 1 
    NOCYCLE 
    NOCACHE 
    NOORDER; 

CREATE OR REPLACE TRIGGER YOUR_SCHEMA_NAME.YOUR_TABLE_NAME_bir 
BEFORE INSERT 
ON YOUR_SCHEMA_NAME.YOUR_TABLE_NAME REFERENCING NEW AS NEW 
FOR EACH ROW 

BEGIN 

    -- Custom code to: generate primary key from idseq if no id is passed 

    IF :NEW.id IS NULL THEN 
    :NEW.id := idseq.NEXTVAL; 
    END IF; 

EXCEPTION 
    WHEN OTHERS THEN 
    raise_application_error(-20570, 'System error: ' || SQLCODE || ':' || SQLERRM, TRUE); 
END; 
/
+0

Я попытался запустить на тестовой среде, извлекая 99, (НЕ заменяя нуль), и она работала отлично. Спасибо за ответ. :) – GrumP

+1

Ahh, я так понимаю, у вашего стола есть только 3 столбца? В этом случае в вашем примере выше вы пытались вставить 4. Ваш 'select max (person_id) +1 из example_table)' в основном выполняет работу триггерной последовательности для вас. Хотя это нормально, возможно, очень эффективный, так как выбор потенциально может занять все больше времени по мере роста таблицы. Использование последовательности + триггер определенно будет лучшим вариантом в этом случае ... Рад помочь :) – StevieG

3

Это неправильный подход. Он не масштабируется и не работает в многопользовательских средах.

Очевидно, что Oracle 12c будет использовать AUTOINCREMENT, как это делает MSSQL. Тем временем вам нужно будет создать последовательность и использовать ее вместо этого.

insert into example_table 
values (person_id_seq.nextval, 'example name', 'example type') 

Find out more.

+0

Это на самом деле умно, рассмотрим это в будущем. Спасибо за полезную информацию. – GrumP

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