Добавление данных: INSERT INTO — вставка одной или нескольких записей

Введение: Зачем нужен INSERT INTO? ️

База данных без данных — как библиотека без книг. INSERT INTO — это ваш инструмент для наполнения таблиц полезной информацией. Хотите добавить нового пользователя, товар или заказ? Без этого оператора никуда!


Базовый синтаксис: Добавляем одну запись 📌

Самый простой способ добавить данные — указать значения для всех столбцов таблицы в порядке их объявления.

INSERT INTO table_name 
VALUES (value1, value2, value3, ...);

Пример: Добавим нового клиента в таблицу customers:

INSERT INTO customers 
VALUES (1, 'Иван Петров', 'ivan@example.com', '+79161234567');

⚠️ Важно: Количество значений должно строго соответствовать количеству столбцов в таблице!


Указание конкретных столбцов

Что если некоторые столбцы допускают NULL или имеют значения по умолчанию? Можно перечислить только нужные столбцы:

INSERT INTO table_name (column1, column2, ...) 
VALUES (value1, value2, ...);

Пример: Добавляем товар, где description не обязателен:

INSERT INTO products (id, name, price) 
VALUES (101, 'Ноутбук', 899.99);

Вставка нескольких записей за один запрос ⚡

Зачем делать 100 отдельных запросов, если можно одним махом? Перечисляем группы значений через запятые:

INSERT INTO table_name (column1, column2, ...) 
VALUES 
    (value1_1, value1_2, ...),
    (value2_1, value2_2, ...),
    ...;

Пример: Добавляем три новых города в таблицу cities:

INSERT INTO cities (id, name, country) 
VALUES 
    (1, 'Москва', 'Россия'),
    (2, 'Санкт-Петербург', 'Россия'),
    (3, 'Нью-Йорк', 'США');

💡 Совет: Такой подход значительно быстрее множественных одиночных вставок!


INSERT + SELECT: Мощь комбинирования 🔥

Можно вставлять данные из других таблиц! Например, скопируем всех клиентов из old_customers в new_customers:

INSERT INTO new_customers (id, name, email)
SELECT id, name, email 
FROM old_customers 
WHERE status = 'active';

🚀 Применение: Миграция данных, создание резервных копий, агрегация.


Ошибки, которые ломают ваш INSERT ❌

1. Несоответствие типов: Попытка вставить строку в числовой столбец.

-- Ошибка! price должен быть числом:
INSERT INTO products (id, name, price) 
VALUES (102, 'Телефон', 'дешево');

2. Нарушение ограничений: UNIQUE, NOT NULL, PRIMARY KEY.

-- Ошибка! id=1 уже существует:
INSERT INTO customers (id, name) 
VALUES (1, 'Повтор');

3. Отсутствующие столбцы: Пропущен обязательный столбец без значения по умолчанию.


Практика: Реальный пример из интернет-магазина

Задача: Добавить новый заказ и его позиции.

1. Сначала добавляем заказ:

INSERT INTO orders (id, customer_id, order_date) 
VALUES (5001, 42, '2023-11-15');

2. Затем — товары в заказ:

INSERT INTO order_items (order_id, product_id, quantity) 
VALUES 
    (5001, 101, 1),
    (5001, 205, 2);

Продвинутые фишки (по мотивам Данилы Бежина) ‍♂️

  • Возврат вставленных данных (PostgreSQL):
INSERT INTO products (name, price) 
VALUES ('Планшет', 299.99) 
RETURNING id;

Пригодится для получения сгенерированного id сразу после вставки.

  • Вставка с обработкой конфликтов (ON CONFLICT):
INSERT INTO customers (id, email) 
VALUES (1, 'new@email.com') 
ON CONFLICT (id) DO UPDATE 
SET email = EXCLUDED.email;

Если запись с id=1 уже есть, обновим её email.

Скрыть рекламу навсегда

🌱 Индвидидулаьные занятия

Индивидуальные онлайн-занятия по программированию для детей и подростков

Личный подход, без воды, с фокусом на понимание и реальные проекты.

🚀 Записаться на занятие