【问题标题】:ORA-00911: invalid character on oracle, but works with H2ORA-00911: oracle 上的无效字符,但适用于 H2
【发布时间】:2014-12-12 06:57:34
【问题描述】:

我有以下 SQL 命令,它适用于 H2 数据库,但是当我尝试在 Oracle XE 上运行它时,它得到“ORA-00911:无效字符”错误。

create table EMPLOYEE (
EMPLOYEE_KEY       NUMBER(10) not null,
SALARY             NUMBER(10,2),
LAST_NAME          VARCHAR2(132),
FIRST_NAME         VARCHAR2(132),
SUPERVISOR_KEY     NUMBER(10),
constraint EMPLOYEE_PK primary key (EMPLOYEE_KEY)
);
create unique index EMPLOYEE_PK on EMPLOYEE(EMPLOYEE_KEY);

【问题讨论】:

  • 您是否提交了两条不同的 SQL 语句?或者您是否尝试一次运行两个不同的 DDL 命令?如果您分别运行它们,哪一个会导致错误?如果您一起运行它们,那将不起作用——您需要分别运行每个 DDL 语句。在创建主键后创建唯一索引也没有任何意义 - 创建主键将自动创建索引,除非您已经有一个可以支持主键的索引。
  • 顺便说一句,第一个DDL 已经定义了EMPLOYEE_PK

标签: database eclipse oracle oracle-xe


【解决方案1】:

在此示例中,当您创建主键约束时,您还创建了一个与您尝试创建的索引同名的索引,EMPLOYEE_PK

Tom Kytes 在他的ask tom 网站上表示:

主键或唯一约束不能保证创建一个新的 索引,他们创建的索引也不能保证是唯一索引。 因此,如果您希望为查询创建唯一索引 性能问题,您应该明确创建一个。

奇怪的是,当我运行 DDL 时,我收到的是 ORA-00955 错误,而不是 ORA-00911(无效字符错误)。

当一个编辑器从一个编辑器复制到另一个编辑器并且您复制了一些不可打印的字符时,通常会发生 ORA-00911 错误。

下面,我运行了提供的第一个 DDL 语句,然后检查了创建的索引。如果您仔细观察,您会发现 EMPLOYEE_PK 索引是作为您创建的主键约束的结果而创建的。

    SCOTT@dev> create table EMPLOYEE (
      2  EMPLOYEE_KEY       NUMBER(10) not null,
      3  SALARY             NUMBER(10,2),
      4  LAST_NAME          VARCHAR2(132),
      5  FIRST_NAME         VARCHAR2(132),
      6  SUPERVISOR_KEY     NUMBER(10),
      7  constraint EMPLOYEE_PK primary key (EMPLOYEE_KEY)
      8  );

    Table created.



    SCOTT@dev> SELECT ind.index_name,
  2    ind.index_type,
  3    ind.table_owner,
  4    ind.table_name
  5  FROM all_indexes ind
  6  JOIN all_ind_columns icol
  7  ON ind.owner       = icol.index_owner
  8  AND ind.table_name = icol.table_name
  9  AND ind.index_name = icol.index_name
 10  WHERE 1            = 1
 11  AND ind.table_name = 'EMPLOYEE'
 12  /


    INDEX_NAME                     INDEX_TYPE                  TABLE_OWNER                    TABLE_NAME
    ============================== =========================== ============================== ==============================
    EMPLOYEE_PK                    NORMAL                      SCOTT                          EMPLOYEE

如果您希望单独在 EMPLOYEE_KEY 上创建唯一索引,可以采用多种方法。这是一个:

    --create the table

    SCOTT@dev> create table EMPLOYEE (
      2  EMPLOYEE_KEY       NUMBER(10) not null,
      3  SALARY             NUMBER(10,2),
      4  LAST_NAME          VARCHAR2(132),
      5  FIRST_NAME         VARCHAR2(132),
      6  SUPERVISOR_KEY     NUMBER(10)
      7  );

    Table created.

    --create the unique index

    SCOTT@dev> CREATE UNIQUE INDEX EMPLOYEE_PK ON EMPLOYEE (EMPLOYEE_KEY);

    Index created.

    --add the primary key

    SCOTT@dev> alter table EMPLOYEE add
      2  constraint EMPLOYEE_PK primary key (EMPLOYEE_KEY)
      3  /

    Table altered.

SCOTT@dev> SELECT ind.index_name,
  2    ind.index_type,
  3    ind.table_owner,
  4    ind.table_name
  5  FROM all_indexes ind
  6  JOIN all_ind_columns icol
  7  ON ind.owner       = icol.index_owner
  8  AND ind.table_name = icol.table_name
  9  AND ind.index_name = icol.index_name
 10  WHERE 1            = 1
 11  AND ind.table_name = 'EMPLOYEE'
 12  /

    INDEX_NAME                     INDEX_TYPE                  TABLE_OWNER                    TABLE_NAME
    ============================== =========================== ============================== ==============================
    EMPLOYEE_PK                    NORMAL                      SCOTT                          EMPLOYEE
    SCOTT@dev> 
 SCOTT@dev> SELECT cons.constraint_name
  2  FROM all_constraints cons
  3  JOIN all_cons_columns conc
  4  ON conc.table_name       = 'EMPLOYEE'
  5  AND cons.owner           = conc.owner
  6  AND cons.table_name      = conc.table_name
  7  WHERE 1                  = 1
  8  AND cons.constraint_name = conc.constraint_name
  9  /

    CONSTRAINT_NAME                
    =============================
    EMPLOYEE_PK     

【讨论】:

    【解决方案2】:

    我不会坚持主键和唯一索引之间的冗余,但是,仅回答标题为您的问题:

    当我尝试在 Oracle XE 上运行它时,它会收到“ORA-00911: invalid character”错误。

    它在; 上大打折扣,据我所知,您一次只能通过 Oracle application Express 的 “SQL Workshop > SQL 命令”页面发出一个 SQL 命令(您也可以发送 PL/SQL 块)

    然而你可以一一选择你的命令然后点击运行。当有选择时,仅执行分段部分。例如,在下面的屏幕截图中,只有第一个 DDL 语句将通过单击 “运行” 按钮执行:

    【讨论】:

      猜你喜欢
      • 2017-06-10
      • 2011-04-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多