Понимание правил обновления и удаления для отношений в SSMS 2008 - PullRequest
17 голосов
/ 16 июля 2009

Меня смущает, что означает правило обновления и удаления в SQL Server 2008 Management Studio, когда мы определяем ограничения внешнего ключа. Я также не нашел связанных справочных документов (например, справка F1).

Вот снимок экрана. Цените, если кто-нибудь может описать, что они имеют в виду, и порекомендовать прочитать некоторые связанные документы. : -)

enter image description here

Ответы [ 4 ]

24 голосов
/ 16 июля 2009

Внешний ключ определяет отношения родитель-потомок между двумя таблицами. Первичным ключом в родительской таблице является внешний ключ в не более n строках дочерней таблицы.

Теперь, если этот первичный ключ в родительской таблице получает UPDATE, запускается правило UPDATE. Либо все дочерние строки также обновляются, либо устанавливаются в NULL, либо как угодно. Однако рекомендуется иметь первичный ключ, который НИКОГДА не меняется (фиксированный идентификатор или что-то в этом роде), так что это менее важное правило.

Более важным является правило УДАЛИТЬ - что если родительская строка удалена (например, Порядок удален)? Вы также можете удалить все дочерние строки (все позиции заказа) с помощью CASCADE DELETE или установить для их внешнего ключа значение NULL (у них больше нет родителя) - это полностью соответствует вашему конкретному сценарию.

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

Марк

3 голосов
/ 17 июля 2009

Похоже, что документация находится на Диалоговое окно "Отношения между внешними ключами" .

Кстати, справка F1 отлично работала для меня в SSMS 2008. Она заняла меня прямо на этой странице (конечно, после того, как я искал полчаса онлайн).

1 голос
/ 16 июля 2009

Страница MSDN выглядит как хорошее начало.

1 голос
/ 16 июля 2009

Поле внешнего ключа может хранить только ноль или значение, определенное полем первичного ключа.

Если вы попытаетесь изменить значение внешнего ключа на то, что не определено первичным ключом, вы получите ошибку. Аналогично, если вы попытаетесь изменить первичный ключ, имеющий зависимости от внешнего ключа, вы получите сообщение об ошибке ... в качестве примера

Models table
modelID (primary key)   model
1                       Jeep   
2                       Ford

Customer table
id    customer   modelID (foreign key of Models.modelID)
1     1234       1
2     2345       2

Если вы попытаетесь удалить запись Jeep из Моделей, вы получите сообщение об ошибке, потому что для клиента 1234 для ID модели установлено значение 1, а это для внешнего ключа. Аналогичным образом, если я попытаюсь обновить клиента 1234, чтобы он имел идентификатор модели 3, он выдаст ошибку, поскольку в таблице моделей нет первичного ключа, имеющего значение 3

.

Проверьте это

...