2014-02-28 52 views
1

我在SQL上工作,而我在創建表時遇到問題! 這裏是我的代碼:ORA-02264:現有約束已被使用的名稱

CREATE TABLE Voucher_Types 
(
    ID Number(3, 0), 
    Abbreviation VarChar(2), 
    Voucher_Type VarChar(100), 
    EntryBy VarChar(25), 
    EntryDate Date, 
    CONSTRAINT ID_PK Primary Key(ID) 
); 

,我得到以下錯誤,
ORA-02264:名稱已經由現有的約束
我使用Oracle10g的
我瞪大眼睛一看,發現有些話題但他們沒有幫助我,有人能幫助我解決這個問題!提前致謝..!

回答

5

您有另一張表,已經約束名稱ID_PK

如果你想找出它是哪個表,你可以嘗試

select owner, table_name from dba_constraints where constraint_name = 'ID_PK'; 

最可能的是,你複製你的create table聲明,但並沒有改變主鍵的約束名稱。

通常認爲在約束名稱中包含表名是一種很好的做法。其中一個原因正是爲了防止這種「錯誤」。

所以,你的情況,你可以使用

CREATE TABLE Voucher_Types 
(
    ... 
    CONSTRAINT Voucher_Types_PK Primary Key(ID) 
); 

更新爲什麼不能在同一約束名被使用了兩次? (根據您在評論中的提問):這完全是因爲它的名稱標識了的約束。如果您在正在運行的系統中違反了約束條件,那麼您想知道它是哪個約束條件,因此您需要一個名稱。但是如果這個名字可以引用多個約束,那麼這個名字就沒有特別的用處。

+0

感謝所有人的回答!我瞭解這個問題,但我有一個問題: 爲什麼沒有兩個表具有相同的約束名稱,即使他們沒有任何關係..! –

+0

O.K.,謝謝!現在我明白了..!!感謝您的回覆..!! –

2

錯誤消息告訴你,有已經在你的架構命名ID_PK另一個約束 - 只是用另一個名字,你應該罰款:

CREATE TABLE Voucher_Types 
(
    ID Number(3, 0), 
    Abbreviation VarChar(2), 
    Voucher_Type VarChar(100), 
    EntryBy VarChar(25), 
    EntryDate Date, 
    CONSTRAINT VOUCHER_TYPES_ID_PK Primary Key(ID) 
); 

要找到有問題的約束:

SELECT * FROM user_constraints WHERE CONSTRAINT_NAME = 'ID_PK' 
0

這意味着有一個名爲ID_PK的約束嘗試 CONSTRAINT Voucher_Types_ID_PK Primary Key(ID)例如

您可以檢查是否存在與

select * from user_constraints where upper(constraint_name) = 'ID_PK'; 

select * from all_constraints where upper(constraint_name) = 'ID_PK'; 
0

弗蘭克·施密特的anwser是好的。 但是,對於約束的名稱,您還可以使用表別名作爲約束名稱的一部分。 約束的名稱可能類似於:vte_pk。並且沒有必要在約束名稱中調用關注列的名稱。 如果主鍵超過2列(或更多),該怎麼辦?

因此... CONSTRAINT VTE_PK Primary Key(ID) ...

0

你必須在其他表 您需要更改約束名

如果你想看到你使用此項約束 你可以看到下面的查詢表名

相同的約束名稱:

選擇TABLE_NAME, constraint_name from user_constraints where lower(constraint_name)='id_pk';