Я работаю над 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 Почему одно и то же имя ограничения не может быть использовано дважды? (Согласно вашему вопросу в комментарии): Именно потому, что это имя идентифицирует ограничение. Если у вас есть нарушение ограничения в работающей системе, вы хотите знать, какое именно ограничение было нарушено, поэтому вам нужно имя. Но если это имя может относиться к нескольким ограничениям, то имя не имеет особого смысла.
Сообщение об ошибке говорит вам, что в вашей схеме уже есть другое ограничение с именем 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'
это означает, что существует ограничение с именем 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';