【问题标题】:create table in Oracle BD but gives error在 Oracle BD 中创建表但给出错误
【发布时间】:2014-01-24 18:33:15
【问题描述】:
CREATE TABLE employees (
  id         INT NOT NULL auto_increment PRIMARY KEY (ID),
  first_name VARCHAR(20) DEFAULT NULL,
  last_name  VARCHAR(20) DEFAULT NULL,
  salary     INT         DEFAULT NULL);

我认为这是在 Oracle 数据库中创建表的正确查询.. 但它给出了以下错误:

ORA-00907:缺少右括号

如何更正该说法?

【问题讨论】:

标签: sql oracle ddl


【解决方案1】:

您可以使用http://www.dpriver.com/pp/sqlformat.htm等格式化工具验证您的SQL

auto_increment 似乎是一个专有的 MySQL 扩展,因此它对 Oracle 无效。

另外,“id int not null auto_increment primary key (id)”不需要最后一个“(id)”

使用 Oracle,你应该尝试这样的事情

    CREATE SEQUENCE seq;

CREATE TABLE employees
  (
     id         INTEGER NOT NULL PRIMARY KEY,
     first_name VARCHAR2(20) DEFAULT NULL,
     last_name  VARCHAR2(20) DEFAULT NULL,
     salary     INTEGER DEFAULT NULL
  );

INSERT INTO employees
VALUES      (seq.NEXTVAL,
         'name',
         'last name',
         1);  

有时,SQL 很奇特,因为即使有一个标准 (ANSI),大多数 DBMS 供应商也会将他们的专有扩展添加到创建自己的语言的 SQL 中,因此很少会出现这样的情况,即您可以将一个 SQL 从一个数据库移植到另一个数据库,而无需任何更改。

此外,这是一个非常无用的错误消息。它至少可以说是哪个位置。 (另外,没有缺少括号,而是一个意外的标记)

【讨论】:

  • 这可能“有效”,但让触发器强制执行主键中的序列会更安全。
【解决方案2】:

已编辑:新功能 12c

CREATE TABLE employees(
  id          NUMBER GENERATED ALWAYS AS IDENTITY,
  first_name  VARCHAR2(30)
etc.
);

为什么要默认为空?

VARCHAR 数据类型与 VARCHAR2 数据类型同义。为避免可能的行为变化,请始终使用 VARCHAR2 数据类型来存储可变长度的字符串。

【讨论】:

  • "id NUMBER GENERATED ALWAYS AS IDENTITY" 能用吗...我试过了,但没用
【解决方案3】:

替换

  id         INT NOT NULL auto_increment PRIMARY KEY (ID),

  id         INT NOT NULL auto_increment PRIMARY KEY,

【讨论】:

    【解决方案4】:

    这样更有效率

    CREATE TABLE EMPLOYEES_T(
    ID NUMBER,
    FIRST_NAME VARCHAR2(20) DEFAULT NULL,
    LAST_NAME VARCHAR2(20) DEFAULT NULL,
    SALARY INTEGER DEFAULT NULL,
    CONSTRAINT PK_EMPLOYEES_T PRIMARY KEY(ID)
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 2015-12-05
      相关资源
      最近更新 更多