Добавление одной записи
Для добавления одной записи в таблицу в MySQL используется команда INSERT. У нее есть две основные формы записи:
-
1-я форма записи
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] имя_таблицы [ (поле1,поле2...) ]
VALUES (значение_поля1, значение_поля2...);
-
2-я форма записи
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] имя_таблицы
SET поле1=значение_поля1, поле2=значение_поля2, ...
Перед использованием команды INSERT следует убедиться, что таблица, в которую нужно вставлять данные, уже существует.
- Инструкция LOW_PRIORITY позволяет отложить вставку новой записи до того момента, пока другие пользователи не завершат чтение таблицы.
- Инструкция DELAYED используется только с таблицами типа MyISAM. Если данная инструкция присутствует, то после выполнения команды INSERT СУБД сразу же вернет ответ об успешном добавлении новой записи. При этом запись будет вставлена только после завершения чтения таблицы другими пользователями.
- Инструкция IGNORE срабатывает при попытке вставить запись с дублирующим значением первичного ключа или уникального индекса. Она позволяет продолжить без прерывания вставку записей, пропуская записи с дубликатами. Если инструкция IGNORE отсутствует, то при появлении дубликата произойдет прерывание с сообщением об ошибке..
Рассмотрим таблицу Tovar со следующей структурой:
Необходимо добавить новый товар «Профнастил», который относится к категории 1. Цена на новый товар пока неизвестна.
Следующие четыре запроса решают данную задачу с одинаковым результатом:
- INSERT tovar (tovar_name,categ) VALUES ("Профнастил",1);
- INSERT INTO tovar (tovar_name,categ) VALUES ("Профнастил",1);
- INSERT INTO tovar (idtovar, tovar_name,categ) VALUES (NULL,"Профнастил",1);
- INSERT INTO tovar SET tovar_name="Профнастил", categ=1;
В приведенном примере первичный ключ idtovar имеет по умолчанию значение AUTO_INCREMENT. Это означает, что при вставке записи СУБД сама заботится о правильном значении этого поля, а пользователь может вообще не упоминать его имя в команде INSERT. Именно так построены запросы 1,2,4.
В запросе 3 поле idtovar указано явно. В случае явного указания поля с автоинкрементом ему следует присвоить значение NULL.
Поле price не используется ни в одном из четырех запросов. Такой вариант допустим, если либо поле имеет значение по умолчанию, либо в него разрешается вставлять NULL. Если поле не имеет значения по умолчанию, а значение NULL для него запрещено, то поле следует явно указывать в команде INSERT. Иначе последует сообщение об ошибке.
Значения, перечисленные в разделе values должны строго соответствовать типу соответствующих полей.
Вставка нескольких записей
Для вставки нескольких записей сразу используется несколько другая форма команды INSERT:
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] имя_талицы [(поле1,поле2...)]
SELECT ..
Место раздела VALUE занимает вложенный запрос SELECT, который возвращает те записи, которые нужно вставить.
При формировании команды INSERT этим способом следует внимательно проверять, соответствует ли структура данных, возвращаемых вложенным запросом, структуре таблицы, в которую производится вставка.
Магазин получает от поставщиков прайс-лист следующего содержания:
Два товара из этого прайс-листа уже присутствуют в таблице tovar, а другие два товара отсутствуют. Требуется построить команду INSERT таким образом, чтобы данные имеющихся товаров не изменились, а два новых товара добавились с их ценами.
INSERT IGNORE INTO tovar (tovar.idtovar, tovar.tovar_name,price) SELECT idtovar,price_list.tovar_name, price_list.price FROM price_list;
Запрос SELECT вернет четыре записи. При попытке вставить эти четыре записи инструкция IGNORE позволит оставить товары «Лак водостойкий» и «Краска интерьерная» без изменений, а две другие записи успешно вставить.