Для вставки записи в таблицу используется оператор INSERT. Однострочный оператор INSERT может использоваться в нескольких формах. Упрощенный синтаксис первой формы выглядит следующим образом:
INSERT [IGNORE] [INTO] tb1 [(col_name, . . .)] VALUES (expression, . . .)
После оператора VALUES в скобках через запятую перечисляются все значения полей таблицы в соответствии с из типами.
Примечание. При описании синтаксиса операторов ключевые слова, которые не являются обязательными и могут быть опущены, заключаются в квадратные скобки.
Создадим в базе данных wet таблицу tb1, cостоящую из двух числовых столбцов: id, который по умолчанию будет иметь значение 5, и id_cat, который будет принимать по умолчанию значение NULL.
Таблица tb1
Cуществует несколько вариантов использования оператора INSERT, каждый из которых приводит к вставке новой записи.
Вставка записи при помощи оператора INSERT
Проверить результат вставки новых записей в таблицу можно при помощи оператора SELECT, синтаксис которого будет разобран далее.
Просмотр содержимого таблицы tb1
Рассмотрим различные формы оператора INSERT более подробно. Первая форма оператора INSERT вставляет в таблицу tb1 запись (10, 20), столбцы получают значение по порядку из круглых скобок, следующих за ключевым словом VALUES. Если значений в круглых скобках будет больше или меньше, чем столбцов в таблице, то сервер MySQL вернет ошибку Column count doesn't match value count at row 1(Не совпадает количество значений и столбцов в запросе).
Порядок занесения значений в запись можно изменить. Для этого следует задать порядок следования столбцов в дополнительных круглых скобках после имени таблицы. Второй оператор INSERT меняет порядок занесения значений: первое значение получает второй столбец id_cat, а второе значение — первый столбец id.
Часть столбцов можно опускать из списка — в этом случае они получают значение по умолчанию. В третьем операторе заполняется лишь поле id, при этом поле id_cat получает значение по умолчанию — NULL.
Четвертый оператор вообще не содержит значений, в этом случае все столбцы таблицы tb1 получат значения по умолчанию, которые определяет ключевое слово DEFAULT. Эффекта последнего оператора можно добиться, если использовать вместо значений ключевое слово DEFAULT.
Использование ключевого слова DEFAULT
Приведенная в первом примере форма оператора INSERT является стандартной и поддерживается всеми СУБД, которые реализуют стандарт SQL. Однако СУБД MySQL поддерживает альтернативный синтаксис оператора INSERT.
Альтернативный синтаксис оператора INSERT
Как видно из листинга, значения присваиваются столбцам при помощи ключевого слова SET; не указанные в операторе столбцы принимают значение по умолчанию.
Просмотр содержимого таблицы
Создадим в базе данных wet таблицу catalogs, которая будет содержать два столбца: числовой столбец id_catalog и текстовой столбец name.
Создание таблицы catalogs
Добавить новую запись в таблицу catalogs можно при помощи запроса представленного ниже.
Добавление новой записи в таблицу catalogs
В таблицу catalogs добавилась новая запись с первичным ключем id_catalog, равным единице, и значением поля name — Процессоры. Строковые значения необходимо помещать в кавычки, в то время как числовые значения допускается использовать без них.
Вместо одиночных кавычек можно использовать двойные кавычки. Когда в текстовое поле необходимо вставить строку, содержащую двойные кавычки, можно использовать для обрамления строки одиночные кавычки и наоборот.
Использование двойных кавычек
В некоторых случаях(например,при использовании одиночных кавычек в качестве обрамляющих и внутри вводимой строки) следует прибегнуть к экранированию внутренних кавычек, т.е. использованию символа \ перед кавычками, включенными в строку.
Примечание. При помещении в базу данных текста, набранного пользователем, вседа следует экранировать кавычки, для того чтобы предотвратить возникновение ошибки и атаку SQL-инъекций.
Экранирование кавычек
В общем случае вставка календарных значений мало чем отличается от вставки строк, однако этот тип данных не случайно выделяют в отдельный класс. Создадим таблицу tbl в базе данных wet. Таблица будет содержать числовое поле id и два календарных поля: putdate типа DATETIME и lastdate типа DATE.
Создание таблицы tbl
Вставка календарных значений
Если столбцу передается "лишняя" информация, то она отбрасывается. В нашем примере в столбец типа DATE передаются часы, минуты и секунды, однако в столбец попадает только информация о дате.
Отбрасывание лишней информации
Зачастую календарные поля предназначены для того, чтобы пометить момент вставки записи в базу данных. Для получения текущего времени удобно воспользоваться встроенной функции MySQL — NOW(). При помощи функции NOW() в таблицу tbl вставляется запись с текущей временной меткой.
Использование функции NOW()
Просмотр содержимого таблицы
Вычисление текущего времени в рамках одного SQL-запроса производится только один раз, сколько бы раз они не вызывались на протяжении данного запроса. Это приводит к тому, что временное значение в рамках всего запроса остается постоянным.
Для получения сдвига даты относительно текущей можно прибавлять и вычитать интервалы. Для этого используется ключевое слово INTERVAL, после которого следует временный интервал.
Использование интервалов
В данном примере в поле putdate помещается дата, эквивалентная 15.03.09 за вычетом 3 недель, а в поле lastdate помещается дата, равная текущей плюс 3 месяца.
Интервалы могут быть различного типа. Полный список допустимых интервалов приводится в ниже следующей таблице.
Типы временных интервалов
Тип | Описание | Формат ввода |
MICROSECOND | Микросекунды | хххххх |
SECOND | Секунды | ss |
MINUTE | Минуты | mm |
HOUR | Часы | hh |
DAY | Дни | DD |
WEEK | Недели | WW |
MONTH | Месяцы | MM |
QUARTER | Квартал | |
YEAR | Год | YY |
SECOND_MICROSECOND | Секунды и микросекунды | 'ss.xxxxxx' |
MINUTE_MICROSECOND | Минуты, секунды и микросекунды | 'mm:ss.xxxxxx |
MINUTE_SECOND | Минуты и секунды | 'mm:ss' |
HOUR_MICROSECOND | Часы, минуты, секунды, микросекунды | 'hh:mm:ss.xxxxxx' |
HOUR_SECOND | Часы, минуты, секунды | 'hh:mm:ss' |
HOUR_MINUTE | Часы и минуты | 'hh:mm' |
DAY_MICROSECOND | Дни, часы, минуты, секунды и микросекунды | 'DD hh:mm:ss.xxxxxx' |
DAY_SECOND | Дни, часы, минуты и секунды | 'DD hh:mm:ss' |
DAY_MINUTE | Дни, часы, минуты | 'DD hh:mm' |
DAY_HOUR | Дни и часы | 'DD hh' |
YEAR_MONTH | Года и месяцы | 'YY-MM' |
Первичный ключ таблицы (PRIMARY KEY) или столбец, индексированный уникальным индексом (UNIQUE), не могут иметь повторяющихся значений. Вставка записи со значением, уже имеющимся в таблице, приводит к возникновению ошибки. Для чистоты "эксперемента" создадим в базе данных wet новую таблицу tb2.
Значения первичного ключа должны быть уникальными
Для того, чтобы новые записи с дублирующим ключем отбрасывались без генерации ошибки, следует добавить после оператора INSERT ключевое слово IGNORE.
Использование ключевого слова IGNORE
Как видно из примера, генерации ошибки не происходит и новой записи также не добавляется.
При добавлении новой записи с уникальными индексами выбор такого уникального значения может быть непростой задачей. Для того, чтобы не осуществлять дополнительный запрос, направленный на выяснение максимального значения первичного ключа для создания нового уникального значения, в MySQL введен механизм его автоматической генерации. Для этого достаточно снабдить первичный ключ атрибутом AUTO_INCREMENT, после чего при создании новой записи достаточно передать данному столбцу в качестве значения NULL или 0. Поле автоматически получит значение, равное максимальному значению в столбце, плюс единица.
Для примера, создадим в базе данных wet таблицу tb3, состоящую из первичного ключа id и текстового поля name. Первичный ключ id снабдим атрибутом AUTO_INCREMENT.
Действие механизма AUTO_INCREMENT