2010-12-29 1 views
2

Я пытаюсь выполнить следующее заявление в оракула:Получение ORA-00905 Ошибка при попытке добавить внешний ключ

alter table COMENTARIO 
add constraint FK_COMENTARIO_DI foreign key (DI_ID) 
    references DATO_DE_INTERES (DI_ID) ON UPDATE CASCADE ON DELETE SET NULL; 

Однако я получаю ORA-00905 недостающее ключевое слово.

Когда я удаляю инструкцию ON UPDATE, команда работает без каких-либо проблем. Почему это? Есть ли какие-либо варианты в случае, если я не могу использовать ON UPDATE? Спасибо заранее!

ответ

2

Не существует предложения «ON UPDATE» для каскадных ограничений. Я не знаю никаких альтернатив, кроме какого-либо применения или триггеров приложений.

+0

Это означает, что нет ОБНОВЛЕНИЯ CASCADE, не так ли? Какие у меня варианты? И почему один из моих одноклассников тоже работает с оракулом и не имеет проблем с использованием этого предложения? – Carlos

+0

Ваш одноклассник не должен был использовать именно эту инструкцию. Нет предложения ON UPDATE, поэтому ON UPDATE CASCADE является недопустимым синтаксисом. –

+0

Итак, нет в обновлении оговорки в оракуле? Это объясняет, почему я не могу использовать его независимо от того, какой вариант я использую ... правильно? – Carlos

1

Существует такой вариант, как ON UPDATE CASCADE в Oracle. Возможно, вместо того, чтобы искать способ реализовать это (я думаю, что это возможно с помощью ON UPDATE триггера), вы могли бы узнать, зачем вам это нужно. Я имею ввиду - зачем вы хотите обновить первичный ключ DATO_DE_INTERES?

+0

Какой хороший вопрос. Я в основном делаю это «в случае», вместо того, чтобы делать это по какой-то причине. – Carlos

+0

ОК, «в случае» вы можете посмотреть здесь: http://tkyte.blogspot.com/2009/10/httpasktomoraclecomtkyteupdatecascade.html –

+0

Спасибо! Но, поскольку это больше связано с DDL, я должен объяснить своему учителю, почему я не могу (и не должен) использовать ON UPDATE ... – Carlos

1

В Oracle нет предложения ON UPDATE в определении ограничения. В подавляющем большинстве случаев вы не захотите реализовать это «на всякий случай», потому что первичные ключи должны быть неизменными. Если ваши первичные ключи не являются неизменяемыми, это обычно указывает на проблему модели данных, которую следует решать, а не кодировать.

Это, если вы действительно хотите реализовать что-то подобное, у Тома Ките есть update cascade package. Но вам гораздо лучше разработать систему, чтобы избежать проблемы в первую очередь, а не разрабатывать ее на таком уровне сложности.

+0

Да, я тоже это прочитал. Интересно, могу ли я использовать это как объяснение моему учителю ... – Carlos