在oracle中使用sequence.nextval创build表

我使用以下查询创build了一个序列,

create sequence qname_id_seq start with 1 increment by 1 nocache; 

现在当我尝试创build一个使用上面的序列的表,它是抛出以下错误,

 Error report: SQL Error: ORA-00907: missing right parenthesis 00907. 00000 - "missing right parenthesis" 

我用下面的查询来创build一个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 ); 

Oracle 12c

现在我们终于有了像许多其他数据库一样的IDENTITY列,以便在后台自动生成一个序列。 这个解决scheme比基于触发器的解决scheme快得多, 正如在这篇博客文章中可以看到的 。

所以,你的表的创build将如下所示:

 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及以下

根据文件 ,你不能这样做:

对默认列值的限制DEFAULTexpression式不能包含对PL / SQL函数或其他列的引用,也不能包含未完全指定的伪列CURRVAL,NEXTVAL,LEVEL,PRIOR和ROWNUM或date常量。

在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 TRIGGER的更多信息

在Oracle 12c中,现在可以将CURRVAL和NEXTVAL序列伪列指定为列的默认值。 或者,您可以使用标识列; 看到:

  • 参考文件
  • 文章:Oracle DB 12cR1中的增强(12.1):12.1 中的表列和标识列的 默认值

例如,

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

我自己更喜欢Lukas Edger的解决scheme。

但是您可能想知道还有一个函数SYS_GUID可以作为默认值应用于列并生成唯一的ID。

你可以在这里阅读更多关于利弊的信息

Oracle 12c中,你也可以声明一个标识列

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

在这里的例子和性能testing…其中,简短地说,结论是直接使用序列或新标识列 比触发器要快得多。

你可以使用Oracle的SQL Developer工具来做到这一点(我的Oracle数据库版本是11)。 在创build表格时,select“ 高级”选项 ,然后单击底部的“ 标识列”选项卡,然后从中select“ 列序列” 。 这将为您生成一个AUTO_INCREMENT列(对应触发器和序列)。