Vladislav_133 12 дек 2011, 13:10
После долгого перерыва возвращаюсь на форум. Можно, наконец, спокойно вздохнуть и заняться своим делом.
И так, я обещал написать об удалении записей из таблиц. Точнее из нескольких таблиц сразу. Поскольку вопрос большой, то ответ будет состоять из нескольких частей.
Сразу хочу отметить, что удаление относиться к «опасным» операциям, а, следовательно, удаление должно производиться с учетом возможных случайных ошибок. Поэтому начну с такого понятия, как ссылочная целостность.
Часть 1. Удаление и ссылочная целостность.
Ссылочная целостность является важнейшим элементом безопасности БД. Кратко говоря, ссылочная целостность представляет собой учет связей между таблицами при выполнении некоторых операций. В частности и в большей степени это относится к удалению. Связи между таблицами можно разделить на «статические» и «динамические». Динамические связи возникают в момент выполнения команды SQL, если она относится сразу к нескольким таблицам. После выполнения команды эта связь пропадает. Начну со статической связи. Статическая связь представляет собой отражение некоторых устойчивых связей, существующих реально в предметной области. Ну, мой любимый пример «ученики» - «оценки». Оценка ставится конкретному ученику – связь налицо. В реляционной базе данных такая устойчивая (статическая) связь выражается с помощью связки «первичный ключ - PK» - «внешний ключ - FK». Посмотрим, как это происходит.
Ученики <id, fio> - оценки <id, id_u, mark>. Для простоты количество столбцов я взял по минимуму. При создании таблицы в большинстве современных СУБД можно указать внешний ключ, в котором указывается главная таблица. В нашем случае при создании таблицы «оценки» создает внешний ключ, в котором указывается таблица «Ученики». Так возникает связка id – id_u, где id – первичный ключ ученика. Это и есть статическая связь. В свойствах статической связи можно указать реакцию на удаление строк из главной таблицы (Ученики). Существует три возможных реакции:
1. Запрет удаления из главной таблицы, если удаляемая строка связана со строками подчиненной таблицы (оценки).
2. Каскадное удаление – вместе со строкой из главной таблицы удаляются все связанные с ней строки в подчиненной таблице.
3. Пометка. При удаление строк из главной таблицы, связанные строки в подчиненной таблице помечаются. Например, значению внешнего ключа присваивается значение NULL.
Вот собственно и все. Установим реакцию 2.
Затем выполним команду типа
DELETE from Ученики where (какое-то условие)
В результате выполнения будут удаляться строки сразу из двух таблиц.
Если же мы выберем вариант 1 (а он обычно действует по умолчанию), то в этом случае как раз будут удаляться только записи, у которых нет связанных записей в подчиненной таблице (ученики без оценок).
Продолжение следует...
Последний раз редактировалось
Vladislav_133 03 апр 2012, 09:01, всего редактировалось 2 раз(а).