Вопрос по database, sql – создать таблицу с sequence.nextval в оракуле [дубликат]

45

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   ответов
2

В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.

2

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

55

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 в документации

Error: User Rate Limit Exceeded Murali
Error: User Rate Limit Exceedednull checkError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Murali
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded:new.qname_idError: User Rate Limit Exceeded:new.id
8

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

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

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

Error: User Rate Limit ExceededSYS_GUID()
45

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

Например.,

CREATE SEQUENCE t1_seq;
CREATE TABLE t1 (
  id          NUMBER DEFAULT t1_seq.NEXTVAL,
  description VARCHAR2(30)
);
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededstackoverflow.com/questions/31546058/…

Похожие вопросы