2014-10-16 14 views
0

我有下面的SQL命令,它與H2數據庫一起工作,但是當我嘗試在Oracle XE上運行它時,它會得到「ORA-00911:invalid character 「錯誤。ORA-00911:oracle上的字符無效,但與H2一起工作

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

你提交兩個不同的SQL語句:例如,下面的屏幕截圖中,只有第一個DDL語句將通過點擊「運行」按鈕執行?或者你是否試圖一次運行兩個不同的DDL命令?如果你分開運行它們,哪一個會導致錯誤?如果你一起運行它們,那就不行了 - 你需要單獨運行每個DDL語句。在創建主鍵後創建唯一索引也沒有意義 - 創建主鍵會自動創建索引,除非您已經有一個可支持主鍵的索引。 – 2014-10-16 19:29:44

+2

順便說一下,第一個'DDL'已經定義了'EMPLOYEE_PK' – 2014-10-16 19:30:38

回答

1

有了這個例子,當你創建的主鍵約束,你還創建了作爲索引你試圖創建,EMPLOYEE_PK相同名稱的指標。

湯姆Kytes指出他ask tom網站:

主鍵或唯一約束不能保證創建新的索引 ,也不是他們創造保證是唯一索引的索引。 因此,如果您希望爲查詢 性能問題創建唯一索引,則應該明確創建一個索引。

奇怪的是,當我運行DDL時,我收到ORA-00955錯誤,而不是ORA-00911(無效字符錯誤)。

當您從一個編輯器複製到另一個編輯器並且您複製一些不可打印的字符時,經常發生ORA-00911錯誤。

下面我運行提供的第一個DDL語句,然後檢查創建的索引。如果仔細觀察,您會看到EMPLOYEE_PK索引是由您創建的主鍵約束創建的。

[email protected]> 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. 



    [email protected]> 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 

    [email protected]> 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 

    [email protected]> CREATE UNIQUE INDEX EMPLOYEE_PK ON EMPLOYEE (EMPLOYEE_KEY); 

    Index created. 

    --add the primary key 

    [email protected]> alter table EMPLOYEE add 
     2 constraint EMPLOYEE_PK primary key (EMPLOYEE_KEY) 
     3/

    Table altered. 

[email protected]> 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 
    [email protected]> 
[email protected]> 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  
+0

同意。謝謝! – 2014-10-16 20:35:13

1

我贏了」堅持主鍵和唯一索引之間的冗餘,但因爲它的標題是,只回答你的問題:

當我嘗試在Oracle XE上運行它,會得到「ORA-00911:invalid character」錯誤。

它肉排;的,據我所知,你只能通過「SQL研討會> SQL命令」頁的Oracle Application Express的時候發出一個SQL命令(您可以發送PL/SQL集團)

但是您可以逐個選擇您的命令並點擊運行。當有選擇時,只執行分段的部分。

APEX Run button executes only selection

相關問題