Создать таблицу с sequence.nextval в oracle
i создал последовательность, используя следующий запрос,
create sequence qname_id_seq start with 1 increment by 1 nocache;
Теперь, когда я пытаюсь создать таблицу, которая использует указанную выше последовательность, она выдает следующую ошибку:
Error report:
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 - "missing right parenthesis"
Я использовал следующий запрос для создания таблицы с sequence.nextval,
CREATE TABLE qname
(
qname_id integer NOT NULL default qname_id_seq.nextval PRIMARY KEY,
qname VARCHAR2(4000) NOT NULL -- CONSTRAINT qname_uk UNIQUE
);
Ответы
Ответ 1
Oracle 12c
Теперь мы, наконец, имеем столбцы IDENTITY
, как и многие другие базы данных, в случае которых последовательность автоматически генерируется за кулисами. Это решение намного быстрее, чем триггерный как можно видеть в этом сообщении в блоге.
Итак, создание таблицы будет выглядеть так:
CREATE TABLE qname
(
qname_id integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL PRIMARY KEY,
qname VARCHAR2(4000) NOT NULL -- CONSTRAINT qname_uk UNIQUE
);
Oracle 11g и ниже
В соответствии с документацией вы не можете этого сделать:
Ограничение значений столбцов по умолчанию. Значение DEFAULT не может содержать ссылки на функции PL/SQL или другие столбцы, псевдоколонны CURRVAL, NEXTVAL, LEVEL, PRIOR и ROWNUM или константы даты, которые не были полностью определены.
Стандартный способ иметь столбцы "auto increment" в Oracle - использовать триггеры, например.
CREATE OR REPLACE TRIGGER my_trigger
BEFORE INSERT
ON qname
FOR EACH ROW
-- Optionally restrict this trigger to fire only when really needed
WHEN (new.qname_id is null)
DECLARE
v_id qname.qname_id%TYPE;
BEGIN
-- Select a new value from the sequence into a local variable. As David
-- commented, this step is optional. You can directly select into :new.qname_id
SELECT qname_id_seq.nextval INTO v_id FROM DUAL;
-- :new references the record that you are about to insert into qname. Hence,
-- you can overwrite the value of :new.qname_id (qname.qname_id) with the value
-- obtained from your sequence, before inserting
:new.qname_id := v_id;
END my_trigger;
Подробнее о Oracle TRIGGERs в документации
Ответ 2
В Oracle 12c теперь вы можете указать псевдокоманды последовательности CURRVAL и NEXTVAL в качестве значений по умолчанию для столбца. Кроме того, вы можете использовать столбцы Identity; см:
например.
CREATE SEQUENCE t1_seq;
CREATE TABLE t1 (
id NUMBER DEFAULT t1_seq.NEXTVAL,
description VARCHAR2(30)
);
Ответ 3
Я для себя предпочитаю решение Lukas Edger.
Но вы можете знать, что есть функция SYS_GUID, которая может использоваться как значение по умолчанию для столбца и генерировать уникальные идентификаторы.
вы можете узнать больше о плюсах и минусах здесь
Ответ 4
В Oracle 12c вы также можете объявить столбец
CREATE TABLE identity_test_tab (
id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
description VARCHAR2(30)
);
примеры и тесты производительности здесь... где, это шорты, вывод заключается в том, что прямое использование последовательности или нового столбца идентификации намного быстрее, чем триггеры.
Ответ 5
Для этого вы можете использовать инструмент Oracle SQL Developer (версия моего Oracle DB - 11). Создав таблицу, выберите Дополнительно и нажмите вкладку Столбец идентификатора внизу и оттуда выберите Последовательность столбцов. Это создаст для вас столбец AUTO_INCREMENT (соответствующий триггер и сквот).