oraclesql中的自动增量

oraclesql中的自动增量,sql,oracle,oracle11g,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" VARCH

我正在尝试在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,但它仍然给了我一个错误:“序列不存在”…

如果您使用双引号创建对象(并且对象名称不全是大写),那么您必须在引用它的任何地方使用双引号

因此,在本例中,这将起作用(注意
Account\u seq
周围的双引号):

也就是说,在任何地方使用双引号都很烦人。相反,考虑更改序列创建以避免使用双引号:

CREATE SEQUENCE Account_seq ...
。。。这样,您可以引用它而不使用双引号,并且序列名不区分大小写

编辑

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

当您双引号引用一个标识符时,Oracle将查找具有确切大小写的标识符

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

例如:

  • “Account\u seq”
    :它将查找
    Account\u seq
  • “AcCoUnT\u SeQ”
    :它将查找
    AcCoUnT\u SeQ
  • Account\u seq
    :它将查找
    Account\u seq
  • AcCoUnT\u SeQ
    :它将查找
    AcCoUnT\u SeQ

如果使用双引号创建对象(并且对象名称不全是大写),则必须在引用对象的任何地方使用双引号

因此,在本例中,这将起作用(注意
Account\u seq
周围的双引号):

也就是说,在任何地方使用双引号都很烦人。相反,考虑更改序列创建以避免使用双引号:

CREATE SEQUENCE Account_seq ...
。。。这样,您可以引用它而不使用双引号,并且序列名不区分大小写

编辑

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

当您双引号引用一个标识符时,Oracle将查找具有确切大小写的标识符

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

例如:

  • “Account\u seq”
    :它将查找
    Account\u seq
  • “AcCoUnT\u SeQ”
    :它将查找
    AcCoUnT\u SeQ
  • Account\u seq
    :它将查找
    Account\u seq
  • AcCoUnT\u SeQ
    :它将查找
    AcCoUnT\u SeQ

如果使用带引号的标识符命名架构对象,则无论何时引用该对象,都必须使用双引号。因此,您的insert语句应该是:

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

如果使用带引号的标识符命名架构对象,则无论何时引用该对象,都必须使用双引号。因此,您的insert语句应该是:

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 server。Stackoverflow建议了它!它建议将其作为以字母sql开头的标记?我建议您也使用显式列名编写
insert
语句,这样您就可以知道哪个值映射到哪个列。如果是关于oracle的,为什么要标记此sql server。Stackoverflow建议这样做!它建议将其作为以字母sql开头的标记?我建议您也使用显式列名编写
insert
语句,这样您就可以知道哪个值映射到哪个列。是的。在我看来,通常没有很好的理由引用这样的字符串。区分大小写不是问题,因为大小写是一样的。@GordonLinoff-你确定是这样吗?@Hogan。我正在读问题,而且
“Account\u seq”
Account\u seq
的情况与我读的情况相同。是的。在我看来,通常没有很好的理由引用这样的字符串。区分大小写不是问题,因为大小写是一样的。@GordonLinoff-你确定是这样吗?@Hogan。我正在阅读问题,而
“Account\u seq”
Account\u seq
的情况与我阅读的情况相同。