2014-02-28 44 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';