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