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

时间:2015-04-22 04:42:28

标签: sql oracle create-table identity-column

我收到此错误,我需要你的帮助:

  

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

3 个答案:

答案 0 :(得分:0)

  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
        );
    
  3. 更多:Oracle IDENTITY

答案 1 :(得分:0)

我认为您尝试在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中执行之前进行转换 变化包括如下

  • 用数字(38)或数字
  • 替换int
  • 带有char(50)或varchar2(50)
  • 的文本
  • 最好在alter statement中添加主键
  • 你使用的不是null,你试图在表格中插入空字符串,在我的视图中,这必须改变一些相关值
  • 没有这样的类型标识(1,1)到oracle 11g,但是它已在Oracle 12中实现,而不是使用sequence与插入之前的触发器自动增加到列

答案 2 :(得分:0)

  

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

因此,您需要明确使用序列。您可以在应用程序中使用旧的触发器序列方法来填充主键。在这里查看演示示例和用法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>

TRIGGER

如果您不想在 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。