Добавить в таблицу Блюда блюдо:
Шашлык (БЛ - 34, Блюдо - Шашлык, В - Г, О - 2, Выход - 150)
при неизвестной пока трудоемкости приготовления этого блюда.
INSERT
INTO Блюда (БЛ, Блюдо, В, О, Выход)
VALUES (34, "Шашлык", "Г", 2, 150);
Создается новая запись для блюда с номером 34, с неопределенным значением в столбце Труд.
Порядок полей в INSERT не обязательно должен совпадать с порядком полей, в котором они определялись при создании таблицы. Вполне допустима и такая версия предыдущего предложения:
INSERT
INTO Блюда (Основа, В, Блюдо, БЛ, Выход)
VALUES (2, "Г", "Шашлык", 34, 150);
При известной трудоемкости приготовления шашлыка (например, 5 руб) сведения о нем можно ввести с помощью укороченного предложения:
INSERT
INTO Блюда
VALUES (34, "Шашлык", "Г", 2, 150, 5);
в котором должен соблюдаться строгий порядок перечисления вводимых значений, так как, не имея перечня загружаемых столб-цов, СУБД может использовать лишь пере-чень, который определен при создании модифицируемой таблицы.
В предыдущих примерах проводилась модификация обозначающей сущности, т.е. таблицы с первичным ключом БЛ. Почти все СУБД имеют механизмы для предотвращения ввода не уникального первичного ключа, например, ввода "Шашлыка" под номером, меньшим 34. А как быть с ассоциациями или другими таблицами, содержащими внешние ключи?
Пусть, например, потребовалось добавить в рецепт блюда Салат летний (БЛ = 1) немного (15 г) лука (ПР = 10):
INSERT
INTO Состав (БЛ, ПР, Вес)
VALUES (1, 10, 15)
ON DUPLICATE KEY UPDATE ПР=10, Вес=15;
Подобно операции DELETE операция INSERT может нарушить непротиворечивость базы данных. Если не принять специальных мер, то СУБД не проверяет, имеется ли в таблице Блюда блюдо с первичным ключом БЛ = 1 и в таблице Продукты - продукт с первичным ключом ПР = 10. Отсутствие любого из этих значений породит противоречие: в базе появится ссылка на несуществующую запись. Проблемы, возникающие при использовании внешних ключей, подробно рассмотрены в литературе, а здесь отметим, что все "приличные" СУБД имеют механизмы для предотвращения ввода записей со значениями внешних ключей, отсутствующих среди значений соответствующих первичных ключей.
|
Вставка множества записей
Здесь необходимо использовать второй формат записи INSERT.
Создать временную таблицу К_меню, содержащую калорийность всех продуктов.
Для создания описания временной таблицы можно, например, воспользоваться предложением CREATE TABLE
CREATE TEMPORARY TABLE К_меню
(Продукт CHAR (60),
Калор Float);
а для ее загрузки данными - предложение INSERT с вложенным подзапросами:
INSERT
INTO К_меню
SELECT Продукт, ((Белки+Углев)*4.1+Жиры*9.3) * Вес/1000) AS Калорийность
FROM Состав, Продукты
WHERE Состав.ПР = Продукты.ПР;
В этом запросе предложение SELECT выполняется так же, как обычно, но результат не выводится на экран, а копируется в таблицу К_меню. Теперь с этой копией можно работать как с обычной базовой таблицей (Блюда, Про-дукты,...), т.е. выбирать из нее даннные на экран или принтер, обновлять в ней данные и т.п. Никакая из этих операций не будет оказывать влияния на исходные данные (например, изменение в ней названия блюда Салат летний на Салат весенний не приведет к подобному изменению в таблице Блюда, где сохранится старое название). Так как это может привести к противоречиям, то подобные временные таблицы уничтожают после их использования. Поэтому программа, обслуживающая шеф-повара, должна исполнять предложение DROP TABLE К_меню после того, как будет закончено составление меню.
|
Предложение UPDATE
Синтаксис предложения UPDATE:
1.
UPDATE [LOW_PRIORITY] [IGNORE] таблица
SET столбец = значение [, столбец = значение...]
[WHERE условие]
[ORDER BY...]
[LIMIT rows]
2.
UPDATE [LOW_PRIORITY] [IGNORE] таблица [,таблица...]
SET столбец = значение [, столбец = значение...]
[WHERE условие]
Здесь
значение={столбец | выражение | константа | переменная}
и может включать столбцы лишь из обновляемой таблицы, т.е. значение одного из столбцов модифицируемой таблицы может заменяться на значение ее другого столбца или выражения, содержащего значения нескольких ее столбцов, включая изменяемый.
При отсутствии WHERE фразы обновляются значения указанных столбцов во всех строках модифицируемой таблицы. WHERE фраза позволяет сократить число обновляемых строк, указывая условия их отбора.
Если указывается ключевое слово IGNORE, то команда обновления не будет прервана, даже если при обновлении возникнет ошибка дублирования ключей. Строки, из-за которых возникают конфликтные ситуации, обновлены не будут.
Примеры: