Сообщение ORA-00001
означает, что вы вставляете повторяющееся значение в столбец. Глядя на ваше выражение create table
, мы можем предположить, что это будет DOC_ID, поэтому вы, должно быть, уже вставили строку с DOC_ID = 1.
Почему же сообщение об ошибке такое загадочное?
ORA-00001: уникальное ограничение (S3705969.SYS_C001160460) нарушено
Загадочное имя связано с тем, что вы создали первичный ключ, не называя ограничение, поэтому Oracle сгенерировал его для вас; ограничения не являются первоклассными объектами базы данных (в отличие от таблиц), но им по-прежнему требуются имена.
Что вы можете сделать, так это назвать ограничение, где вы его создаете, например,
create table Doctor
(
docID INTEGER,
appointID INTEGER ,
regnum CHAR(6),
doc_name VARCHAR(40),
doc_gender CHAR(1),
qual VARCHAR(80),
constraint DOCTOR_PK primary key (docID),
constraint DOCTOR_APPOINTMENT_FK foreign key (appointID)
references Appointment(column_name)
);
Но если вы обнаружите, что работаете со схемой, в которой отсутствуют имена, вы можете использовать словарь данных, чтобы узнать, что происходитL
select c.table_name
, decode (c.constraint_type
, 'P', 'Primary key'
, 'U', 'Unique key'
, 'R', 'Foreign key'
, 'C', 'Check') as constraint_type
, cc.column_name
from all_constraints c
join all_cons_columns cc
on cc.owner = c.owner
and cc.table_name = c.table_name
and cc.constraint_name = c.constraint_name
where c.owner = 'S3705969'
and c.constraint_name = 'SYS_C001160460'
order by cc.position
/
Кстати, кажется, что ваш внешний ключ неправильный. У одного врача много назначений, поэтому в таблице APPOINTMENT должен быть столбец DOCTOR_ID с внешним ключом, ссылающимся на таблицу DOCTOR.
Предположительно, потому что у вас уже есть строка, в которой
docID
равно "1".Скорее всего в этой таблице уже есть запись с DocID=1. Запустите
SELECT * FROM Doctor where DocId=1
, чтобы проверить, существует ли такая запись. Существует ограничениеprimary key (docID),
, которое предотвращает дублирование в столбце ID.