Базовый курс SQL. Запись данных в таблицы. INSERT

Forums:

[к оглавлению]

На предыдущих уроках мы рассматривали, как можно извлекать данные: с помощью SELECT. Теперь пришло время узнать, как данные появляются в таблицах.

Добавление данных в таблицы

Для добавления данных используется ключевое слово INSERT. Используя его, можно:

  • добавлять целую строку
  • добавлять часть строки
  • добавлять результат другого запроса

Требования к безопасности

В некоторых СУБД на выполнение клиентом операции INSERT могут накладываться дополнительные ограничения. Убедитесь, что вашему пользователю достаточно прав для записи данных.

Добавление целой строки

Это базовый вариант данного запроса: указываем имя таблицы и перечисляем значения, соответствующие всем её столбцам:

INSERT INTO Teachers
VALUES (1026, 'Евгений', 'Обломов', 'Александрович');

С помощью такого запроса в таблицу будет добавлена новая строка. Обратите внимание на порядок указываемых значений: в данном случае он должен строго соответствовать порядку столбцов при создании таблицы. Если для какого-то столбца значения нет, вместо него обязательно нужно указать NULL.

Ключевое слово INTO

В разных реализациях SQL ключевое слово INTO не является обязательным. Но мы рекомендуем всё же указывать его в любом случае - это повысит переносимость кода, что несомненно является большим плюсом.

Возвращаясь к способу передачи полей в запрос стоит отметить, что предложенный выше синтаксис наиболее простой, но не безопасный. Во-первых, мы можем не знать, в каком порядке поля были инициализированы, в таблице. Во-вторых, впоследствии может быть произведено добавление / удаление полей, и наш код при повторном использовании сделает запись с ошибкой. Лучшим вариантом будет явное прописывание названий всех полей таблицы:

INSERT INTO Teachers (teacher_id, teacher_name, teacher_surname, teacher_middle_name)
VALUES (1026, 'Евгений', 'Обломов', 'Александрович');

В данном примере каждому полю (в первых скобках) соответствует значение VALUE (во вторых скобках). При этом реальный порядок полей в таблице не важен. Если мы поменяем местами и названия, и значения, запрос пройдёт корректно:

INSERT INTO Teachers (teacher_surname, teacher_name, teacher_middle_name, teacher_id)
VALUES ('Обломов', 'Евгений', 'Александрович', 1026);

Во избежание ошибок, всегда указывайте имена столбцов явно.

Следите за корректностью значений в VALUE

Независимо от синтаксиса, следите за тем, чтобы все значения чётко соответствовали нужным полям: если поле задано, значение обязательно должно быть указано или заменено NULL.

Добавление части строки

Ещё один плюс явного указания названия столбцов заключается в том, что мы можем указать поля частично. И, соответственно, присвоить значения только им. Пропущенные столбцы получат значение NULL или значение по умолчанию (DEFAULT), если таковое предусмотрено определением таблицы.

INSERT INTO Teachers (teacher_surname, teacher_name, teacher_id)
VALUES ('Ульссон', 'Людвиг', 1046);

В данном примере пропущено поле teacher_middle_name по причине отсутствия отчества у иностранного преподавателя. Запустите данный код и сможете убедиться, что в базе данных этому полю присвоено значение NULL.

Будьте внимательны!

  1. Порядок записываемых значений должен строго соответствовать расположению имён столбцов, иначе в таблице появятся некорректные данные
  2. Если поле имеет характеристику NOT NULL и не имеет DEFAULT значения, пропускать его при операции INSERT нельзя. SQL сгенерирует ошибку

Добавление результата другого запроса

Чаще всего INSERT используется для добавления уже заданных значений в таблицу. Но если данные, которые мы хотим записать, хранятся в другой таблице этой же базы данных, мы можем одновременно извлекать их и записывать, добавив к INSERT подзапрос SELECT.

Исходная таблица

Давайте перенесём данные о старых факультетах из таблицы OldFaculties в уже имеющуюся таблицу Faculties. Чтобы предотвратить возникновение ошибок, проверьте:

  • содержание извлекаемых и записываемых полей, а также их количество, должно строго совпадать
  • одинаковых значений в полях, являющихся первичными ключами таблиц быть не должно

Итак, переносим:

INSERT INTO Faculties (faculty_id, faculty_name)
SELECT old_faculty_id, old_faculty_name
FROM OldFaculties;

Каждый столбец из SELECT соответствует столбцу из INSERT. Имена столбцов в таблицах различаются, но это допустимо. Главное, чтобы в них содержались аналогичные сущности.

Стоит отметить, что в нашем случае используется наиболее простой вариант подзапроса SELECT, однако при необходимости можно добавлять в него условия WHERE или другие операторы, не нарушающие порядок вывода столбцов.

В отличии от оператора INSERT, который может добавлять только по одной строке, INSERT SELECT добавил все строки, имеющиеся в таблице OldFaculties в Faculties с помощью только одного запроса. А если бы исходная таблица не имела ни одного значения, операция также могла бы завершится без ошибок, с тем только различием, что в базе данных не произошло бы никаких изменений.

Копирование данных из одной таблицы в другую

Есть и другой способ добавления данных в SQL, который вообще не использует оператор INSERT. Чтобы создать новую таблицу, содержащую данные одной из существующих таблиц, можно применить SELECT INTO.

Поддерживается не всеми СУБД

Указанный ниже синтаксис не поддерживается в DB2.

В чём разница между INSERT SELECT и SELECT INTO

  • первая импортирует данные, а вторая - экспортирует
  • первая добавляет данные в существующую таблицу, вторая - создаёт новую таблицу "на лету" (если такая таблица уже существует, она может быть перезаписана)
CREATE TABLE NewFaculties AS
  SELECT * FROM Faculties;

Эта операция создаёт таблицу NewFaculties и копирует в неё все строки из Faculties. Можно также копировать не все столбцы: для этого необходимо указать их явно вместо символа *

В некоторых СУБД допустим ещё более простой синтаксис:

SELECT *
  INTO NewFaculties
  FROM Faculties;

Правила использования SELECT INTO:

  • запрос SELECT разрешается дополнять условиями WHERE,GROUP BY и другими ключевыми словами
  • можно копировать данные из нескольких таблиц, используя JOIN-ы
  • независимо от того, сколько у нас исходных таблиц, конечная таблица может быть только одна

Создание копий таблиц - незаменимый инструмент для экспериментов с запросами. Если вы не хотите потерять реальные данные, находящиеся в таблице, хорошим решением будет создать резервную копию и на ней проводить тестирование.

Дополнительные примеры использования оператора INSERT можно увидеть в приложении Содаём тестовую БД

Следующая страница. Обновление и удаление данных
Оглавление.