第 2 行出现错误:ORA-00907:缺少右括号
ERROR at line 2: ORA-00907: missing right parenthesis
我遇到了这个错误,我需要你的帮助:
ERROR at line 2: ORA-00907: missing right parenthesis
CREATE TABLE users(
user_id int IDENTITY(1,1) PRIMARY KEY,
user_name varchar2(100) NOT NULL DEFAULT '',
user_password varchar2(100) NOT NULL DEFAULT '',
f_name varchar2(50) NOT NULL DEFAULT '',
l_name varchar2(50) NOT NULL DEFAULT '',
signature text NOT NULL DEFAULT '',
link varchar2(255) NOT NULL DEFAULT '',
category_id int NOT NULL DEFAULT 1
);
oracle中没有text
数据类型。
Oracle 12c之前的ORACLE中没有IDENTITY
修饰符。如果您使用的是 Oracle 12c,请使用此
CREATE TABLE users(
user_id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
user_name varchar2(100) NULL DEFAULT '',
user_password varchar2(100) NULL DEFAULT '',
f_name varchar2(50) NULL DEFAULT '',
l_name varchar2(50) NULL DEFAULT '',
signature clob NULL DEFAULT '',
link varchar2(255) NULL DEFAULT '',
category_id int NULL DEFAULT 1
);
我认为您尝试在 oracle
中执行 sql 脚本
CREATE TABLE users(
user_id int IDENTITY(1,1) PRIMARY KEY,
user_name varchar2(100) NOT NULL DEFAULT '',
user_password varchar2(100) NOT NULL DEFAULT '',
f_name varchar2(50) NOT NULL DEFAULT '',
l_name varchar2(50) NOT NULL DEFAULT '',
signature text NOT NULL DEFAULT '',
link varchar2(255) NOT NULL DEFAULT '',
category_id int NOT NULL DEFAULT 1
);
但我们必须在它在 oracle 中执行之前进行转换
变化包括如下
- 将 int 替换为数字 (38) 或数字
- 使用 char(50) 或 varchar2(50) 的文本
- 最好在 alter 语句中添加主键
- 您正在使用 not null 并尝试在 table 中插入空字符串,在我看来,这必须更改为一些相关值
- 在 oracle 11g 之前不会有这样的类型标识 (1,1) 但它已在 Oracle 12 中实现,而不是标识使用 sequence 和插入触发器自动递增到列
NOT NULL DEFAULT ''
''
是一个空字符串,在Oracle中被认为是NULL。因此,具有 NOT NULL 约束是没有意义的,但是 defaulting 值再次变为 NULL。 自相矛盾!
您的 table DDL 存在多个问题。像这样创建 table:
SQL> CREATE TABLE users(
2 user_id NUMBER PRIMARY KEY,
3 user_name VARCHAR2(100) DEFAULT 'default' NOT NULL,
4 user_password VARCHAR2(100) DEFAULT 'default' NOT NULL,
5 f_name VARCHAR2(50) DEFAULT 'default' NOT NULL,
6 l_name VARCHAR2(50) DEFAULT 'default' NOT NULL,
7 signature VARCHAR2(255) DEFAULT 'default' NOT NULL,
8 LINK VARCHAR2(255) DEFAULT 'default' NOT NULL,
9 category_id NUMBER DEFAULT 1 NOT NULL
10 );
Table created.
SQL>
关于 Identity column 的注释。由于您使用的是 10g 版本,因此不支持标识列。它是在 12c 中引入的。
因此,您需要明确使用序列。您可以在应用程序中使用旧的 trigger-sequence 方法来填充主键。在这里查看示例和用法的演示 http://lalitkumarb.wordpress.com/2015/01/20/auto-increment-primary-key-in-pre-12c-releases-identity-functionality/
例如,
TABLE
SQL> CREATE TABLE t (
2 ID NUMBER(10) NOT NULL,
3 text VARCHAR2(50) NOT NULL);
Table created.
SQL>
PRIMARY KEY 由 sequence
填充
SQL> ALTER TABLE t ADD (
2 CONSTRAINT id_pk PRIMARY KEY (ID));
Table altered.
SQL>
SEQUENCE支持主键
SQL> CREATE SEQUENCE t_seq
2 START WITH 1000
3 INCREMENT BY 1;
Sequence created.
SQL>
触发
如果您不想在 INSERT 中包含序列,您可以通过 TRIGGER 使其自动化。
SQL> CREATE OR REPLACE TRIGGER t_trg
2 BEFORE INSERT ON t
3 FOR EACH ROW
4 WHEN (new.id IS NULL)
5 BEGIN
6 SELECT t_seq.NEXTVAL
7 INTO :new.id
8 FROM dual;
9 END;
10 /
Trigger created.
SQL>
插入
SQL> INSERT INTO t(text) VALUES('auto-increment test 1');
1 row created.
SQL> INSERT INTO t(text) VALUES('auto-increment test 2');
1 row created.
SQL>
让我们看看我们是否让 ID 列自动增加了所需的值-
SQL> SELECT * FROM t;
ID TEXT
----- --------------------------------------------------
1000 auto-increment test 1
1001 auto-increment test 2
SQL>
因此,ID 列现在从值 1000 开始,并在后续插入时递增 1。
我遇到了这个错误,我需要你的帮助:
ERROR at line 2: ORA-00907: missing right parenthesis
CREATE TABLE users(
user_id int IDENTITY(1,1) PRIMARY KEY,
user_name varchar2(100) NOT NULL DEFAULT '',
user_password varchar2(100) NOT NULL DEFAULT '',
f_name varchar2(50) NOT NULL DEFAULT '',
l_name varchar2(50) NOT NULL DEFAULT '',
signature text NOT NULL DEFAULT '',
link varchar2(255) NOT NULL DEFAULT '',
category_id int NOT NULL DEFAULT 1
);
oracle中没有
text
数据类型。Oracle 12c之前的ORACLE中没有
IDENTITY
修饰符。如果您使用的是 Oracle 12c,请使用此CREATE TABLE users( user_id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY, user_name varchar2(100) NULL DEFAULT '', user_password varchar2(100) NULL DEFAULT '', f_name varchar2(50) NULL DEFAULT '', l_name varchar2(50) NULL DEFAULT '', signature clob NULL DEFAULT '', link varchar2(255) NULL DEFAULT '', category_id int NULL DEFAULT 1 );
我认为您尝试在 oracle
中执行 sql 脚本CREATE TABLE users(
user_id int IDENTITY(1,1) PRIMARY KEY,
user_name varchar2(100) NOT NULL DEFAULT '',
user_password varchar2(100) NOT NULL DEFAULT '',
f_name varchar2(50) NOT NULL DEFAULT '',
l_name varchar2(50) NOT NULL DEFAULT '',
signature text NOT NULL DEFAULT '',
link varchar2(255) NOT NULL DEFAULT '',
category_id int NOT NULL DEFAULT 1
);
但我们必须在它在 oracle 中执行之前进行转换 变化包括如下
- 将 int 替换为数字 (38) 或数字
- 使用 char(50) 或 varchar2(50) 的文本
- 最好在 alter 语句中添加主键
- 您正在使用 not null 并尝试在 table 中插入空字符串,在我看来,这必须更改为一些相关值
- 在 oracle 11g 之前不会有这样的类型标识 (1,1) 但它已在 Oracle 12 中实现,而不是标识使用 sequence 和插入触发器自动递增到列
NOT NULL DEFAULT ''
''
是一个空字符串,在Oracle中被认为是NULL。因此,具有 NOT NULL 约束是没有意义的,但是 defaulting 值再次变为 NULL。 自相矛盾!
您的 table DDL 存在多个问题。像这样创建 table:
SQL> CREATE TABLE users(
2 user_id NUMBER PRIMARY KEY,
3 user_name VARCHAR2(100) DEFAULT 'default' NOT NULL,
4 user_password VARCHAR2(100) DEFAULT 'default' NOT NULL,
5 f_name VARCHAR2(50) DEFAULT 'default' NOT NULL,
6 l_name VARCHAR2(50) DEFAULT 'default' NOT NULL,
7 signature VARCHAR2(255) DEFAULT 'default' NOT NULL,
8 LINK VARCHAR2(255) DEFAULT 'default' NOT NULL,
9 category_id NUMBER DEFAULT 1 NOT NULL
10 );
Table created.
SQL>
关于 Identity column 的注释。由于您使用的是 10g 版本,因此不支持标识列。它是在 12c 中引入的。
因此,您需要明确使用序列。您可以在应用程序中使用旧的 trigger-sequence 方法来填充主键。在这里查看示例和用法的演示 http://lalitkumarb.wordpress.com/2015/01/20/auto-increment-primary-key-in-pre-12c-releases-identity-functionality/
例如,
TABLE
SQL> CREATE TABLE t (
2 ID NUMBER(10) NOT NULL,
3 text VARCHAR2(50) NOT NULL);
Table created.
SQL>
PRIMARY KEY 由 sequence
填充SQL> ALTER TABLE t ADD (
2 CONSTRAINT id_pk PRIMARY KEY (ID));
Table altered.
SQL>
SEQUENCE支持主键
SQL> CREATE SEQUENCE t_seq
2 START WITH 1000
3 INCREMENT BY 1;
Sequence created.
SQL>
触发
如果您不想在 INSERT 中包含序列,您可以通过 TRIGGER 使其自动化。
SQL> CREATE OR REPLACE TRIGGER t_trg
2 BEFORE INSERT ON t
3 FOR EACH ROW
4 WHEN (new.id IS NULL)
5 BEGIN
6 SELECT t_seq.NEXTVAL
7 INTO :new.id
8 FROM dual;
9 END;
10 /
Trigger created.
SQL>
插入
SQL> INSERT INTO t(text) VALUES('auto-increment test 1');
1 row created.
SQL> INSERT INTO t(text) VALUES('auto-increment test 2');
1 row created.
SQL>
让我们看看我们是否让 ID 列自动增加了所需的值-
SQL> SELECT * FROM t;
ID TEXT
----- --------------------------------------------------
1000 auto-increment test 1
1001 auto-increment test 2
SQL>
因此,ID 列现在从值 1000 开始,并在后续插入时递增 1。