Заявление MSDN является верным на основании использования зависимостей (внешних ключей).Думайте о порядке как
- Дочерняя таблица (каскадное удаление)
- Родительская таблица: вставьте и / или обновите и / или удалите запись, означающую последний шаг каскадного удаления.
- Дочерняя таблица: вставить или обновить.
Поскольку мы говорим о каскадном удалении, мы должны гарантировать, что при удалении родительской записи необходимо удалить любую дочернюю запись, относящуюся к родителю, прежде чем мыудалить родительскую запись.Если у нас нет дочерних записей, удаление на дочернем уровне невозможно.Вот и все.
С другой стороны, вы можете подходить к вашему делу по-разному.Я думаю, что реальный (почти) сценарий будет более полезным.Предположим, что родительская таблица является основной частью заказов (orderID, clientID и т. Д.), А дочерняя таблица является частью сведений (detailID, orderID, productOrServiceID и т. Д.).Таким образом, вы получаете заказ, и у вас есть следующий
родительский стол
orderID = 1 (auto increment)
...
дочерний стол
detailID = 1 (auto increment)
orderID = 1
productOrServiceID = 342
and
detailID = 2
orderID = 1
productOrServiceID = 169
and
detailID = 3
orderID = 1
productOrServiceID = 307
Таким образом, у нас есть один заказ на три продукта / услуги.Теперь ваш клиент хочет, чтобы вы перевели второй продукт или услугу в новый заказ и доставили его позже.У вас есть два варианта сделать это.
Первый (прямой)
Создать новый заказ (новую родительскую запись), который получает orderID = 2
Обновите дочернюю таблицу, установив orderID = 2, где orderID = 1 и productOrServiceID = 169
В результате у вас будет
Родительская таблица
orderID = 1 (auto increment)
...
and
orderID = 2
...
Дочерний стол
detailID = 1 (auto increment)
orderID = 1
productOrServiceID = 342
and
detailID = 2
orderID = 2
productOrServiceID = 169
and
detailID = 3
orderID = 1
productOrServiceID = 307
Второй (косвенный)
Хранить DataRow второго продукта / услуги из дочерней таблицыв качестве переменной
Удалить относительную строку из дочерней таблицы
Создать новый заказ (новую родительскую запись), который получает orderID = 2
Вставьте сохраненный DataRow в дочернюю таблицу, изменив поле orderID с 1 на 2
В результате у вас будет
Родительская таблица
orderID = 1 (auto increment)
...
and
orderID = 2
...
Дочерняя таблица
detailID = 1 (auto increment)
orderID = 1
productOrServiceID = 342
and
detailID = 3
orderID = 1
productOrServiceID = 307
and
detailID = 4
orderID = 2
productOrServiceID = 169
Причиной второго варианта, который, кстати, является предпочтительным для многих приложений, являетсяэто дает необработанные последовательности подробных идентификаторов для каждой родительской записи.Я видел случаи расширения второго варианта путем воссоздания всех подробных записей.Я думаю, что довольно легко найти решения с открытым исходным кодом, относящиеся к этому случаю, и проверить реализацию.
Наконец, мой личный совет - избегать подобных вещей с наборами данных, если ваше приложение не является однопользовательским.Базы данных могут легко справиться с этой «проблемой» потокобезопасным способом с транзакциями.