Добавление данных: 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.