При удалении ограничить справку SQL - PullRequest
0 голосов
/ 14 февраля 2011

У меня есть две следующие таблицы:

    Owner:

    O_ID P_ID
    Bob   Sam
    Steve Rex


    Pets

    P_ID O_ID
    Sam  Bob
    Rex  Steve

Второй столбец владельцев (P_ID) - это внешний ключ для первого столбца питомцев (P_ID).

В DB2Я пытаюсь добавить ограничение ON_DELETE RESTRICT, чтобы, если бы кто-то попытался удалить владельца в таблице владельцев, если бы этот владелец был владельцем домашнего животного, операция удаления была бы отклонена.Я знаю, что должен использовать команду ON_DELETE RESTRICT, но я не знаю, как это сделать.

Я пробовал это:

ALTER TABLE OWNERS
ADD CONSTRAINT no_delete
FOREIGN KEY (P_ID)
REFERENCES PETS(P_ID)
ON DELETE RESTRICT

Безрезультатно.

Ответы [ 2 ]

4 голосов
/ 14 февраля 2011

Ваш синтаксис правильный.Ваша логика неверна.

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

3 голосов
/ 16 февраля 2011

Catcall верен, вот правильная команда ALTER TABLE (протестировано в DB2 LUW v9.7):

ALTER TABLE домашние животные и ограничение no_delete FOREIGN KEY (P_ID) ССЫЛКИ владелец (P_ID) НА УДАЛИТЬ RESTRICT;

Затем, когда я попытался удалить Стива из таблицы владельца, с помощью следующей команды:

УДАЛИТЬ ОТ владельца, где O_ID = 'Steve';

Я получил, как и ожидалось:

DB21034E Команда была обработана как оператор SQL, потому что это не было допустимая команда процессора командной строки. Во время обработки SQL он вернул: SQL0532N Родительская строка не может быть удален, потому что отношения "DB2INST1.PETS.NO_DELETE" ограничивает удаление. SQLSTATE = 23001

Затем, чтобы убедиться, что это работает полностью, как и ожидалось, я стер собаку Стива:

УДАЛИТЬ ОТ домашних животных ГДЕ O_ID = 'Steve'

И снова попытался удалить Стива из таблицы владельца, и это сработало!

...