ORA-02264: имя уже используется существующим ограничением

Я работаю над 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
I Goggled It And Found Some Topics But They Didn't Help Me, Can Somebody Help Me In This Problem! Заранее спасибо...!

Решение

У вас есть другая таблица, на которую уже наложено ограничение с именем 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)
);

Update Почему одно и то же имя ограничения не может быть использовано дважды? (Согласно вашему вопросу в комментарии): Именно потому, что это имя идентифицирует ограничение. Если у вас есть нарушение ограничения в работающей системе, вы хотите знать, какое именно ограничение было нарушено, поэтому вам нужно имя. Но если это имя может относиться к нескольким ограничениям, то имя не имеет особого смысла.

Комментарии (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)