Изменение данных: INSERT, UPDATE, DELETE

Изменение данных: INSERT, UPDATE, DELETE

Тестировщик не только читает данные — иногда нужно создать тестовые данные, изменить состояние объекта или очистить базу после теста. Для этого используются три команды: INSERT, UPDATE, DELETE.


INSERT: добавление данных

INSERT добавляет новые строки в таблицу.

Одна строка

INSERT INTO users (name, email, is_active)
VALUES ('Тест Пользователь', 'test@example.com', true);

Столбцы с DEFAULT (например, id SERIAL, created_at DEFAULT NOW()) можно не указывать — база подставит значение автоматически.

Несколько строк за раз

INSERT INTO products (name, category, price, stock)
VALUES
  ('Ноутбук Dell', 'Электроника', 45000, 10),
  ('Мышь Logitech', 'Электроника', 2500, 50),
  ('Стол письменный', 'Мебель', 8000, 5);

INSERT с возвратом данных (PostgreSQL)

INSERT INTO users (name, email)
VALUES ('Новый Тест', 'newtest@example.com')
RETURNING id, created_at;
-- Возвращает: id и created_at вставленной записи

UPDATE: изменение данных

UPDATE изменяет значения в существующих строках.

UPDATE users
SET is_active = false
WHERE id = 5;

Обновление нескольких столбцов

UPDATE orders
SET status = 'paid', updated_at = NOW()
WHERE id = 42;

Обновление по условию

-- Заблокировать всех пользователей, не заходивших больше года
UPDATE users
SET is_active = false
WHERE last_login < NOW() - INTERVAL '1 year';

-- Поднять цену всех товаров в категории на 10%
UPDATE products
SET price = price * 1.1
WHERE category = 'Электроника';

⚠️ Опасность UPDATE без WHERE

-- ЭТО ОБНОВИТ ВСЕ СТРОКИ В ТАБЛИЦЕ!
UPDATE orders SET status = 'cancelled';

Это одна из самых распространённых критических ошибок. Если забыть WHERE — изменятся все записи в таблице.

Безопасный workflow:

  1. Сначала напишите SELECT с тем же WHERE, убедитесь что найдены нужные строки
  2. Затем выполните UPDATE/DELETE
-- Шаг 1: проверить что найдём нужные записи
SELECT id, status FROM orders WHERE user_id = 5 AND status = 'pending';

-- Шаг 2: только если результат верный — обновлять
UPDATE orders SET status = 'cancelled' WHERE user_id = 5 AND status = 'pending';

DELETE: удаление данных

DELETE удаляет строки из таблицы.

-- Удалить конкретного пользователя
DELETE FROM users WHERE id = 99;

-- Удалить тестовые данные после теста
DELETE FROM users WHERE email LIKE 'test_%@example.com';

-- Удалить старые отменённые заказы
DELETE FROM orders
WHERE status = 'cancelled'
  AND created_at < NOW() - INTERVAL '6 months';

DELETE с возвратом удалённых данных (PostgreSQL)

DELETE FROM users WHERE id = 99
RETURNING id, name, email;

⚠️ Опасность DELETE без WHERE

-- ЭТО УДАЛИТ ВСЕ СТРОКИ В ТАБЛИЦЕ!
DELETE FROM users;

Правило то же: сначала SELECT, потом DELETE.


Порядок удаления при FK

Если между таблицами есть Foreign Key, нельзя удалить родителя, пока есть зависимые дочерние записи. Нужно соблюдать порядок.

-- Неверный порядок: orders ссылаются на users
DELETE FROM users WHERE id = 5;  -- ❌ Ошибка FK constraint

-- Верный порядок: сначала дочерние, потом родительские
DELETE FROM order_items WHERE order_id IN (
  SELECT id FROM orders WHERE user_id = 5
);
DELETE FROM orders WHERE user_id = 5;
DELETE FROM users WHERE id = 5;  -- ✅ Теперь можно

Типичные сценарии для тестировщика

Создание тестового пользователя

INSERT INTO users (name, email, is_active)
VALUES ('Тест Автоматизации', 'autotest_001@test.com', true)
RETURNING id;
-- Запоминаем id для последующих запросов

Установка нужного состояния

-- Перевести заказ в статус 'paid' для теста страницы «Спасибо за покупку»
UPDATE orders
SET status = 'paid'
WHERE id = 101;

Очистка тестовых данных

-- Удалить всё, что создали в тесте (в обратном порядке FK)
DELETE FROM order_items
WHERE order_id IN (SELECT id FROM orders WHERE user_id = 200);

DELETE FROM orders WHERE user_id = 200;

DELETE FROM users WHERE id = 200;

Итоги

  • INSERT — добавляет строки; RETURNING возвращает данные вставленной записи
  • UPDATE — изменяет данные; всегда указывайте WHERE
  • DELETE — удаляет строки; всегда указывайте WHERE
  • Безопасный паттерн: сначала SELECT с тем же WHERE, убедитесь в результате, затем UPDATE/DELETE
  • При удалении соблюдайте порядок FK: сначала дочерние таблицы, потом родительские
  • UPDATE table SET col = val без WHERE — обновит все строки таблицы
  • DELETE FROM table без WHERE — удалит все строки таблицы

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике