为什么在第 3 行出现错误:ORA-00907:使用 IDENTITY 时 SQL 中缺少右括号

Why am I getting Error at line 3: ORA-00907: missing right parenthesis in my SQL when using IDENTITY

我正在尝试在 Oracle 数据库 12C 企业版 12.2.0.1.0 上使用 SQL 命令创建 table。

我希望在向 table 添加新值时创建一个新的 TRANS_num,从 1 开始并递增 1。

我的代码如下:

CREATE TABLE Sales
(
    TRANS_num INTEGER  IDENTITY (1,1) PRIMARY KEY,
    c_name VARCHAR (35) NOT NULL,
    c_address VARCHAR (35) NOT NULL,
    c_phonenumber CHAR (10) NOT NULL,
);

在我复制并粘贴到 Tera Term 和 运行 代码

后,这会产生下图

有什么想法吗?我在这里浏览了一些类似问题的答案,但似乎没有什么可以解决的。我对编码很陌生,如果它很简单,请原谅。

无论你从哪里得到语法,它一定说过,它适用于 SQL 服务器或其他一些 DBMS,但不是 Oracle。

自 Oracle 12c 以来最接近的是 GENERATED ... AS IDENTITY。您可以使用

...
trans_num integer GENERATED AS IDENTITY ...
...

...
trans_num integer GENERATED ALWAYS AS IDENTITY ...
...

(如果省略,ALWAYS为默认选项) 如果需要,该值始终生成并且不能在 INSERT

中被覆盖
...
trans_num integer GENERATED BY DEFAULT AS IDENTITY ...
...

如果您希望在 INSERT 中未指定 trans_num 时生成该值,但如果已指定则取给定值(给定值 [=20= 除外) ], 将引发错误), 或

...
trans_num integer GENERATED BY DEFAULT ON NULL AS IDENTITY ...
...

这将表现得像没有 ON NULLBY DEFAULT 除了 NULL 值可以在 INSERT 中给出,但会被生成的值覆盖。

也可以选择用于CREATE SEQUENCE的选项,例如

... GENERATED ... AS IDENTITY (START WITH 1 INCREMENT BY 1) ...

从 1 开始值,并为每个后续生成的值将它们递增 1。 (START WITH 1 INCREMENT BY 1) 就是你所拥有的。但这也是默认设置,因此您也可以保留它。

您的代码有两个问题。

  • identity 列必须具有语法:generated always as IDENTITY。您可以省略 always 关键字,因为它是默认关键字。此外 identity 列在 oracle 12.1 及更高版本 上受支持。
  • comma (,) 最后一列必须删除。

因此您的代码必须如下所示:

CREATE TABLE Sales
(
    TRANS_num INTEGER generated always as IDENTITY  PRIMARY KEY, -- changes here
    c_name VARCHAR (35) NOT NULL,
    c_address VARCHAR (35) NOT NULL,
    c_phonenumber CHAR (10) NOT NULL -- removed comma
);

Db<>fiddle demo

干杯!!