Целостностью внешних ключей (ссылочная целостность) обеспечивается тем, что внешние ключи не могут ссылаться на строки, отсутствующие в родительских таблицах.
Ссылочную целостность могут нарушить след. операции над данными:
1) Обновление первичного ключа в строке родительской таблицы
2) Удаление строки в родительской таблице
3) Вставка новой строки в дочернюю таблицу
4) Обновление внешнего ключа в строке дочерней табицы
Для поддержания ссылочной целостности используются 2 стандартных правила:
1) Ограничить (RESTRICT) - не разрешать выполнение операций, приводящее к появлению ссылочной целостности. Это правило, требующее лишь проверки существования связей между данными в родительской и дочерней таблицах.
2) Каскадировать (CASCADE) – разрешать выполнение требуемой операции, но внести при этом необходимые изменения в связанные таблицы так, чтобы не допустить нарушения ссылочной целостности между данными. Изменения начинаются в главной (родительской) таблице и каскадно, т. е. поочередно выполняются в подчиненных таблицах. Правило хорошо тем, что после выполнения операции с сопупств. Каскадными изменениями будут сохранятся все имеющиеся связи между данными.
Дополнительные правила поддержки ссылочной целостности являются:
1) Установить в NULL (set null) – разрешить выполнение требуемой операции, однако все некорректные значения внешнего ключа изменить на null – значения
2) Установить по умолчанию (set default) – разрешить значения требуемой операции, однако все некорректные значения внешнего ключа изменить на значения, принятые по умолчанию
Дополнительные правила ссылочной целостности могут исп-ся тогда, когда дочерняя таблица явл-ся независимой от родительской.
Можно вообще отказать от поддержания ссылочной целостности с помощью правила «игнорировать» (IGNORE) – разрешить выполнение любой операции, не обращая внимания на нарушения правила ссылочной целостности.
30. Язык SQL : основные команды манипулирования данными.
Язык SQL (Structured Query Language - структурированный язык запросов) представляет собой стандартный высокоуровневый язык описания данных и манипулирования ими в системах управления базами данных (СУБД), построенных на основе реляционной модели данных.
Язык SQL был разработан фирмой IBM в конце 70-х годов. Первый международный стандарт языка был принят международной стандартизирующей организацией ISO в 1989 г., а новый (более полный) - в 1992 г. В настоящее время все производители реляционных СУБД поддерживают с различной степенью соответствия стандарт SQL92.
Основные категории команд языка SQL:
· DDL, или язык определения данных
· DML, или язык манипулирования данными
· DQL, или язык запросов
· DCL, или язык управления данными
· Команды администрирования данных
· Команды управления транзакциями
Язык манипулирования данными (DML) — это часть языка SQL, предназначенная для реального внесения пользователем изменений в информацию, содержащуюся в реляционной базе данных. С помощью команд языка манипулирования данными пользователь может загружать в таблицы новые данные, а также изменять и удалять существующие. Команды DML также могут быть использованы при выполнении простых запросов к базе данных.
В языке SQL существует три основных команды DML:INSERT, UPDATE, DELETE.
Единственной структурой представления данных (как прикладных, так и системных) в реляционной базе данных (БД) является двумерная таблица.
В реляционной модели данных таблица обладает следующими основными свойствами:
· идентифицуруется уникальным именем;
· имеет конечное ненулевое количество столбцов;
· имеет конечное (возможно, нулевое) число строк;
· столбцы таблицы идентифицируются своими уникальными именами и номерами;
· содержимое всех ячеек столбца принадлежит одному типу данных;
· в общем случае ячейки таблицы могут оставаться пустыми, такое их состояние обозначается как NULL.
31. Язык SQL: вставка новой записи в таблицу.
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
VALUES (expression,...),(...),...
либо
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name
SET col_name=expression, col_name=expression, ...
либо
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
Общие положения работы команды INSERT:
tbl_name
- Задает имя таблицы, в которую будет вставлена новая строка. На момент запуска команды INSERT таблица с таким именем должна существовать в базе данных.
LOW_PRIORITY
- Если указан этот параметр, то вставка новой записи будет отложена до тех пор, пока другие сценарии не закончат чтение из этой таблицы. Надо отметить, что если таблица часто используется, то при указании этого параметра может пройти достаточно много времени, прежде чем данная команда будет выполнена.
DELAYED
- Если указан этот параметр, то после выполнения команды INSERT сценарий сразу же получит ответ от БД о успешной вставке новой записи, а запись будет вставлено только после завершения использования данной таблицы другим сценарием. Это может быть удобно, если требуется высокая скорость работы скрипта. Данный параметр работает только с таблицами типа ISAM и MyISAM. Следуем отметить, что если таблица, в которую происходит вставка записи, в данный момент не используется другими запросами, то команда INSERT DELAYED будет работать медленнее, нежели INSER. Так что рекомендуется использовать параметр DELAYED только при большой нагрузке на таблицу.
IGNORE
- Если некоторые поля таблицы имеют ключи PRIMARY или UNIQUE, и производится вставка новой строки, в которой эти поля имеют дублирующее значение, то действие команды аварийно завершается и выдается ошибка №1062 ("Duplicate entry 'val' for key N"). Если в команде INSERT указано ключевое слово IGNORE, то вставка записей не прерывается, а строки с дублирующими значениями просто не вставляются.
Если MySQL был сконфигурирован с использованием опции DONT_USE_DEFAULT_FIELDS, то команда INSERT будет генерировать ошибку, если явно не указать величины для всех столбцов, которые требуют значений не-NULL.
Для того, чтобы узнать значение, присвоенное полю с ключом AUTO_INCREMENT, можно воспользоваться функцией mysql_insert_id().
Для добавления новых записей в существующую таблицу при помощи команды INSERT существует три основных синтаксиса:
INSERT ... VALUES
- В этом случае в команде четко указывается порядок следования устанавливаемых полей и их значений.
INSERT INTO Поставщик (КодПоставщика, ИмяПоставщика, КодРегиона)
VALUES (123, 'ЗАО Магистраль', 101)
INSERT INTO Регион
VALUES (301, 'Украина', 'Крымская', 'Алушта', 'ул.Франко, 24',
NULL, '46-49-16')
GO
32. Язык SQL : удаление записей из таблицы.
Синтаксис оператора DELETE FROM
DELETE [LOW_PRIORITY | QUICK] FROM table_name
[WHERE where_definition]
[ORDER BY ...]
[LIMIT rows]
или
DELETE [LOW_PRIORITY | QUICK] table_name[.*] [,table_name[.*] ...]
FROM table-references
[WHERE where_definition]
или
DELETE [LOW_PRIORITY | QUICK]
FROM table_name[.*], [table_name[.*] ...]
USING table-references
[WHERE where_definition]
Команда DELETE удаляет из таблицы table_name все записи, удовлетворяющие условию where_definition. Если условие WHERE where_definition не задано, то из таблицы table_name удаляются все записи.
Команда DELETE возвращает количество удаленных записей.
Следует учитывать, что если в команде DELETE не задано условие WHERE where_definition, то команда возвратит 0, хотя записи были удалены.
Если все же необходимо удалить все записи и узнать их количество, то в условии where_definition нужно задать заведомо истинное значение:
Но в этом случае выполнение команды происходит значительно медленнее.
LOW_PRIORITY
- Если указано это ключевое слово, то удаление записей из таблицы table_name не будет произведено до тех пор, пока другие процессы не закончат чтение их этой таблицы.
QUICK
- Если указано это ключевое слово, то при удалении записей обработчик таблицы не будет объединять индексы, что может ускорить операцию удаления.
table_name
- Имя таблицы в базе данных, из которой будет происходить удаление строк.
LIMIT
- Задает максимальное количество строк, которые могут быть удалены за текущий запрос.
SET DATEFORMAT dmy -- задаем привычный формат даты: день.месяц.год