为什么在第 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 NULL
的 BY 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
);
干杯!!
我正在尝试在 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 NULL
的 BY 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
);
干杯!!