【问题标题】:ERROR at line 2: ORA-00907: missing right parenthesis第 2 行出现错误:ORA-00907:缺少右括号
【发布时间】:2015-04-22 04:42:28
【问题描述】:

我遇到了这个错误,我需要你的帮助:

第 2 行出现错误:ORA-00907:缺少右括号

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
);

【问题讨论】:

  • 你有额外的 , category_id int NOT NULL DEFAULT 1,
  • 谢谢,但我仍然遇到同样的错误...
  • 您使用的是什么版本的 Oracle? IDENTITY(1,1) 在任何版本中均无效。但是你至少可以在 12.1 中定义一个标识列。 text 不是有效的数据类型。而且空字符串和NULL 不是不同的东西,所以声明一个列NOT NULL 然后尝试通过空字符串将其默认为NULL 是没有意义的。
  • 好的,我修正了文本有效类型。我正在使用 10.2.0.4.0。
  • @JustinCave:我相信你都掌握了;这应该是一个答案:)

标签: sql oracle create-table identity-column


【解决方案1】:

NOT NULL DEFAULT ''

''是一个空字符串,在Oracle中被认为是NULL。因此,具有 NOT NULL 约束但 默认 再次将值设置为 NULL 是没有意义的。 矛盾!

您的表 DDL 存在多个问题。像这样创建表:

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 版本,因此不支持 Identity 列。它是在 12c 中引入的。

因此,您需要明确使用序列。您可以在应用程序中使用旧的 trigger-sequence 方法来填充主键。在这里查看演示示例和用法http://lalitkumarb.wordpress.com/2015/01/20/auto-increment-primary-key-in-pre-12c-releases-identity-functionality/

例如,

表格

SQL> CREATE TABLE t (
  2    ID           NUMBER(10)    NOT NULL,
  3    text  VARCHAR2(50)  NOT NULL);
Table created.
SQL>

PRIMARY KEY序列

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

【讨论】:

    【解决方案2】:
    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不能有'',所有的空字符串都为空,不是吗? user_name VARCHAR2(100) NOT NULL 可以,user_name VARCHAR2(100) DEFAULT '' 可以,但不能合并它们,因为你说默认值是不允许的。
    【解决方案3】:

    我以为你尝试在 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 替换为 number(38) 或 number
    • 带有 char(50) 或 varchar2(50) 的文本
    • 最好在 alter 语句中添加主键
    • 您使用的是 not null 并且您尝试在表中插入空字符串,在我看来这必须用一些相关值进行更改
    • 在 oracle 11g 之前不会有这样的类型标识 (1,1),但它已在 Oracle 12 中实现,而不是使用标识使用 sequence 并在插入触发器之前自动递增到列

    【讨论】:

    • Oracle 中没有identity
    • 身份在 Oracle 12 中
    • 不,它没有。不使用该语法:docs.oracle.com/database/121/SQLRF/…
    • @a_horse_with_no_name 请问我做了什么建议放在表格查询下方
    猜你喜欢
    • 2016-10-23
    • 2015-03-31
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 2013-05-12
    • 2014-03-25
    • 1970-01-01
    相关资源
    最近更新 更多