第 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
);
  1. oracle中没有text数据类型。

  2. 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 IDENTITY

我认为您尝试在 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 KEYsequence

填充
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。