当前位置: 首页 > 知识库问答 >
问题:

在oracle中使用Sequence.NextVal创建表[重复]

柏正平
2023-03-14
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个答案

陆才俊
2023-03-14

像许多其他数据库一样,我们现在终于有了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
);

根据文档,您不能这样做:

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 CREATE TABLE语句简介,Oracle CREATE TABLE示例在本教程中,您将学习如何使用Oracle 语句在Oracle数据库中创建一个新表。 Oracle CREATE TABLE语句简介 要在Oracle数据库中创建一个新表,可以使用语句。下面说明了语句的基本语法: 在上面这个语法中, 首先,在子句中,指定新表所属的表名和模式名称。 其次,在圆括号内列出所有列。 如果一个表有多个列,则需要用逗号分隔每个列的定义。列定义包括列名,后跟它的数据类型,例如,

  • 问题内容: 我正在尝试创建一个将在每个圣诞节执行特定程序的工作。这是我走了多远: 但是我似乎找不到一种简单的方法来将时间间隔更改为每年一次,并且总体上对如何解决这个问题感到很困惑,任何帮助都非常感谢 问题答案: 你想要类似的东西 该作业将在2012年圣诞节的午夜首次运行,此后每12个月运行一次。

  • 问题内容: 我需要能够生成运行查询,该查询将返回下表中的ID的下一个值: 在Oracle中,您可以在序列上调用NEXTVAL,它为您提供下一个序列(注意:不必在表上进行插入)。 谷歌搜索后,我发现您可以使用以下查询找到auto_increment的当前值: 问题是我希望每次查询该值时该值都增加。在Oracle中,当您调用nextval时,即使不将行插入表中,序列的值也会增加。 有什么方法可以修改上

  • 问题内容: 我需要能够生成运行查询,该查询将返回下表中的ID的下一个值: 在Oracle中,你可以在序列上调用NEXTVAL,它为你提供下一个序列(注意:不必在表上进行插入)。 谷歌搜索之后,我发现你可以使用以下查询找到auto_increment的当前值: 问题是我希望每次查询该值时该值都增加。在Oracle中,当你调用nextval时,即使不将行插入表中,序列的值也会增加。 有什么方法可以修改

  • 问题内容: 我想创建一个在不从现有的表中选择,而是具有插入到它的数据。当前,我正在创建一个表,然后在完成后将其删除。有没有一种方法可以有效地创建相同的对象?这是我当前的代码: 问题答案: 您可以通过从对偶中选择日期值并将它们结合在一起来创建公用表表达式(CTE,子查询分解等)。 与CTE无关,但是您可以通过使用日期文字来减少输入: