2009-07-27 3 views
3

В современных версиях Oracle существует некоторая «стандартная» (хранимая процедура, дополнительный синтаксис CREATE и т. Д.) Способ создания таблицы с колонкой auto_increment/identity style или мы все еще застреваем вручную создание таблицы, создание последовательности и создание триггера.Oracle и auto_increment/identity

Обновление: Я понимаю, что у Oracle нет понятия auto_increment. Я заинтересован в том, что если какой-либо из стандартных инструментов Oracle автоматизировал создание последовательности и триггера, или если администратор базы данных оставлен для создания необходимых запросов/команд для создания последовательности и инициирования самих себя.

+0

Создание последовательностей - это не работа для администратора базы данных. «CREATE SEQUENCE my_sequence» еще проще, чем «SELECT SYSDATE FROM DUAL». – jva

+0

Семантика. Заменить «человек, которому необходимо создать все таблицы» для администратора базы данных. Это не вопрос тяжелый, это вопрос утомительного. –

ответ

5

Если вы хотите последовательно увеличивать упорядоченные значения, то нет, SEQUENCE - единственный выбор.

Если вы хотите просто личность, использовать SYS_GUID()

2

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

Вы можете использовать GUID. У Oracle есть функция SYS_GUID(), которую вы можете использовать вместо этого.

3

Oracle SQL Developer дает вам возможность автоматически создавать код создания или замены триггера, который заполняет первичный ключ таблицы из последовательности. Для этого из дерева навигатора щелкните правой кнопкой мыши имя таблицы> Триггер> Создать (PK из последовательности). Однако он не создает последовательность для вас.

3

На самом деле вам не нужен триггер, вы можете просто ссылаться на следующее значение последовательности при заполнении новой строки в таблице. Вы можете даже поделиться одной последовательностью между несколькими таблицами, если хотите.

+1

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

+0

Хороший фон для работы, особенно с производительностью триггера/г/т, но следует отметить, что это отправит ваш SQL на землю, отличную от ANSI (что может быть или не быть проблемой, в зависимости от вашей ситуации). –

3

В Oracle 12c дальше вы могли бы сделать что-то подобное,

CREATE TABLE MAPS 
(
MAP_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), 
MAP_NAME VARCHAR(24) NOT NULL, 
UNIQUE (MAP_ID, MAP_NAME) 
) 

И в Oracle (Pre 12с).

-- create table 
CREATE TABLE MAPS 
(
MAP_ID INTEGER NOT NULL , 
MAP_NAME VARCHAR(24) NOT NULL, 
UNIQUE (MAP_ID, MAP_NAME) 
) 
--create sequence 
CREATE SEQUENCE MAPS_SEQ; 
-- create tigger using the sequence 
CREATE OR REPLACE TRIGGER MAPS_TRG 
BEFORE INSERT ON MAPS 
FOR EACH ROW 
WHEN (new.MAP_ID IS NULL) 
BEGIN 
    SELECT MAP_ID_SEQ.NEXTVAL 
    INTO :new.MAP_ID 
    FROM dual; 
END; 
/
--enable the trigger 
ALTER TRIGGER MAPS_TRG ENABLE ; 

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

  • Нет связанных вопросов^_^