2017-02-08 18 views
1

У меня есть одна таблица, ссылающаяся на другую. Как я вижу - есть два способа удаления каскадирование:SQL Create Trigger Before Delete vs Foreign Key On Delete

Что разница между CREATE TRIGGER BEFORE DELETE и FOREIGN KEY ON DELETE? Существуют ли различия в производительности?

Я воспользовался этим преимуществом FOREIGN KEY:
Каскадное удаление более очевидно, потому что оно прикреплено в определении таблицы.

Полный вопрос:
У меня есть две таблицы:
project(id, ...) <- works_on(id, project_id, ...)

Каковы различия в

CREATE TABLE works_on (
    ... 
    FOREIGN KEY (project_id) REFERENCES project ON DELETE CASCADE 
    ... 
); 

и

CREATE TRIGGER trigger_delete_cascading 
    BEFORE DELETE ON project 
    DELETE works_on 
    WHERE project_id = id; 
+2

Они очень похожи. Я бы посоветовал вам всегда идти с каскадным удалением (если это то, что вы хотите), поэтому база данных заботится о реляционной целостности. Это также имеет преимущество проверки значения в столбце. –

+0

В моем случае ваш комментарий и принятый ответ Сержа разрешают эту тайну. Sagar Gangwal также посоветовал использовать «Foreign Key» в отношении большей последовательности: http://stackoverflow.com/a/42114888/1700776 – Vadammt

ответ

3

A FOREIGN KEY ограничивает значения, которые могут быть сохранены в столбце project_id таблицы works_on. Вы не сможете установить значение, которое не существует в таблице project.

A TRIGGER не ограничивает диапазон значений, которые могут быть сохранены.

3

Если написал триггер BEFORE удалить, будет УДАЛИТЬ запись от CHILD TABLE и из-за некоторой ошибки сервера или другого ограничения, если запись не может быть удалена с ОСНОВНАЯ ТАБЛИЦА (PARENT), тогда она делает избыточные данные. Итак, всякий раз, когда вам нужно удалить плюс больше действий, таких как сохранение таблицы журналов, тогда вам нужно только запустить Trigger.Otherwise ON DELETE CASCADE отлично работает. Надеюсь, это поможет вам.