Подтвердить что ты не робот

Создать таблицу с 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
);
4b9b3361

Ответ 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 (соответствующий триггер и сквот).