Oracle SQL中的自动增量

时间:2015-10-02 15:42:18

标签: sql oracle oracle11g

我正在尝试在Oracle SQL中创建一个自动增量的表。我有以下SQL代码:

DROP TABLE "Account" CASCADE CONSTRAINTS;
CREATE TABLE "Account" (
  "Id" NUMBER(5) NOT NULL,
  "Name" VARCHAR2(32) NOT NULL,
  "User" VARCHAR2(16) NOT NULL,
  "Email" VARCHAR2(32) NOT NULL,
  "Password" VARCHAR2(16) NOT NULL,
  "Level" VARCHAR2(16) NOT NULL,
  CONSTRAINT "Account_pk" PRIMARY KEY ("Id")
);

DROP SEQUENCE "Account_seq";
CREATE SEQUENCE "Account_seq" START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 10000;

INSERT INTO "Account" VALUES (Account_seq.NEXTVAL, 'xxx', 'xxx', 'xxx', 'xxx', 'user');
INSERT INTO "Account" VALUES (Account_seq.NEXTVAL, 'xxx', 'xxx', 'xxx', 'xxx', 'user');

Oracle SQL Developer说创建了Account_seq,但它仍然给我一个错误:“序列不存在”......

2 个答案:

答案 0 :(得分:6)

如果你使用双引号来创建一个对象(并且对象名称不是全部大写),那么你不得不在引用它的任何地方使用双引号。

所以在这种情况下,这会起作用(注意Account_seq周围的双引号):

INSERT INTO "Account" VALUES ("Account_seq".NEXTVAL, 'xxx', 'xxx', 'xxx', 'xxx', 'user');

那就是说,到处使用双引号很烦人。相反,请考虑更改序列创建以避免使用双引号:

CREATE SEQUENCE Account_seq ...

......这样,您可以在没有双引号的情况下引用它,并且序列名称不会区分大小写。

修改

稍微澄清区分大小写部分:

当您双引号标识符时,Oracle会查找具有该确切大小写的标识符。

另一方面,如果你不使用双引号,它将寻找所有大写的等效标识符。

示例:

  • "Account_seq":它会查找Account_seq
  • "AcCoUnT_SeQ":它会查找AcCoUnT_SeQ
  • Account_seq:它会查找ACCOUNT_SEQ
  • AcCoUnT_SeQ:它会查找ACCOUNT_SEQ

答案 1 :(得分:0)

如果使用带引号的标识符命名架构对象,则每次引用该对象时都必须使用双引号。所以你的插入语句应该是:

INSERT INTO "Account" VALUES ("Account_seq".NEXTVAL, 'xxx', 'xxx', 'xxx', 'xxx', 'user');
INSERT INTO "Account" VALUES ("Account_seq".NEXTVAL, 'xxx', 'xxx', 'xxx', 'xxx', 'user');