我正在研究SQL而且我在创建表时遇到了问题! 这是我的代码:
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
我瞥了一眼并发现了一些话题,但是他们没有帮助我,有人可以在这个问题上帮助我!在此先感谢..!
答案 0 :(得分:6)
您有另一个已经使用名称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)
);
更新为什么不能使用相同的约束名称两次? (根据评论中的问题):这正是因为它是标识约束的名称。如果您在正在运行的系统中违反约束,则需要知道它是哪个约束,因此您需要一个名称。但是,如果此名称可以引用多个约束,则该名称没有特别用途。
答案 1 :(得分:3)
错误消息告诉您模式中已经存在另一个名为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'
答案 2 :(得分:1)
您在其他表中具有相同的约束名称 您需要更改约束名称
如果要查看使用此约束的表名 你可以看到以下查询:
从user_constraints中选择table_name,constraint_name,其中lower(constraint_name)='id_pk';
答案 3 :(得分: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';
答案 4 :(得分:0)
弗兰克施密特的说法很好。 但是,对于约束的名称,您还可以使用表别名作为约束名称的一部分。 约束的名称类似于:vte_pk。并且没有必要在约束名称中调用相关列的名称。 如果主键超过2(或更多)列会怎样?
因此... CONSTRAINT VTE_PK Primary Key(ID) ...
。