создать таблицу с sequence.nextval в оракуле [дубликат]

This question already has an answer here:

How to create id with AUTO_INCREMENT on Oracle? 16 answers

я создал последовательность, используя следующий запрос,

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
);

Ответы на вопрос(5)

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 and below

Согласнодокументация, тебе этого не сделать:

Restriction on Default Column Values A DEFAULT expression cannot contain references to PL/SQL functions or to other columns, the pseudocolumns CURRVAL, NEXTVAL, LEVEL, PRIOR, and ROWNUM, or date constants that are not fully specified.

Стандартный способ «автоматического увеличения» столбцы в 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 в документации

ВOracle 12c Вы также можете объявитьidentity column

CREATE TABLE identity_test_tab (
  id          NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
  description VARCHAR2(30)
);

примеры & amp; тесты производительностиВот ... где шорты, вывод заключается в том, чтоdirect use of the sequence или новыйidentity column являютсяmuch faster than the triggers.

Вы можете использовать OracleSQL Developer инструмент для этого (моя версия Oracle DB 11). При создании таблицы выберитеAdvanced option и нажмите наIdentity Column вкладка внизу и оттуда выбратьColumn Sequence, Это создастAUTO_INCREMENT колонка (соответствующий триггер и последовательность) для вас.

В Oracle 12c теперь можно указывать псевдостолбцы последовательности CURRVAL и NEXTVAL в качестве значений по умолчанию для столбца. Кроме того, вы можете использовать столбцы Identity; увидеть:

Например.,

CREATE SEQUENCE t1_seq;
CREATE TABLE t1 (
  id          NUMBER DEFAULT t1_seq.NEXTVAL,
  description VARCHAR2(30)
);

Я для себя предпочитаю решение Лукаса Эдгера.

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

Вы можете прочитать больше о плюсах и минусахВот

Ваш ответ на вопрос