Внешний ключ определяет отношения между родителями и дочерними элементами между двумя таблицами. Первичным ключом в родительской таблице является внешний ключ в строках до n дочерних таблиц.
Теперь, если этот первичный ключ в родительской таблице получает UPDATE, UPDATE RUL запускается. Либо все дочерние строки также обновлены, установлены значения NULL или что-то еще. Однако лучше всего иметь первичный ключ, который НИКОГДА не изменяется (фиксированный идентификатор или что-то еще), поэтому это менее важное правило.
Более важным является правило DELETE - что, если родительская строка удалена (например, заказ удален)? Вы также можете удалить все дочерние строки (все позиции заказа) с помощью CASCADE DELETE или вы можете установить их внешний ключ в NULL (у них больше нет родителя) - это полностью соответствует вашему конкретному сценарию.
В сценарии строк заказа/порядка может оказаться совершенно полезным удалить строки заказа, когда полный заказ будет удален, но вы, вероятно, не хотите удалять продукт, просто потому, что заказ, который ссылается на него, был deleted - нет ни одного ПРАВИЛЬНОГО ответа - это зависит от вашего сценария и вашего приложения.
Марк
Спасибо Marc, я изучаю эту страницу MSDN, http://msdn.microsoft.com/en-us/library/ms186973%28SQL.90%29.aspx Одна путаница, упоминается «Если каскадные ссылочные действия также были определены в целевых таблицах ... », моя путаница кажется выше четырех действий (NO ACTION | CASCADE | SET NULL | SET DEFAULT), мы могли бы определить и другие действия? – George2
Нет, вы можете определить одно из этих четырех действий для сценариев UPDATE и DELETE. О чем говорится в статье, является сценарий, в котором TableB ссылается на TableA и имеет «ON DELETE CASCADE», поэтому, если строка из таблицы A будет удалена, все дети в TableB также будут удалены. Если в этом случае есть таблица TableB, ссылающаяся на таблицуB с действием ON DELETE CASCADE, то это удаление в TableA переходит в TableB, а затем в TableC. –
Спасибо, Марк, мне нравится ваш ответ! – George2