INSERT, UPDATE и DELETE

Меняем содержимое таблиц: добавляем, обновляем и удаляем строки безопасно.

Команды INSERT, UPDATE и DELETE изменяют данные в таблице — в отличие от SELECT, который только читает.

INSERT — добавление строк

Можно вставлять по одной строке, а можно пакетом — это эффективнее, чем много отдельных INSERT.

CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT,
  price INTEGER
);

INSERT INTO products (name, price) VALUES ('Кофе', 300);

INSERT INTO products (name, price) VALUES
  ('Чай', 150),
  ('Сок', 200),
  ('Вода', 50);

SELECT name, price FROM products ORDER BY price DESC;

Вывод:

name  price
Кофе  300
Сок   200
Чай   150
Вода  50

UPDATE — обновление

UPDATE меняет значения в существующих строках. Золотое правило: почти всегда нужен WHERE. Без него обновятся ВСЕ строки таблицы.

CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT,
  price INTEGER
);

INSERT INTO products (name, price) VALUES
  ('Кофе', 300), ('Чай', 150), ('Сок', 200);

UPDATE products SET price = price + 50 WHERE name = 'Чай';

SELECT name, price FROM products ORDER BY id;

Вывод:

name  price
Кофе  300
Чай   200
Сок   200

Подорожал только «Чай», потому что мы ограничили обновление через WHERE.

DELETE — удаление строк

То же предупреждение: DELETE без WHERE очистит всю таблицу. Указывайте условие.

CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT,
  price INTEGER
);

INSERT INTO products (name, price) VALUES
  ('Кофе', 300), ('Чай', 150), ('Вода', 50);

DELETE FROM products WHERE price < 100;

SELECT name, price FROM products ORDER BY id;

Вывод:

name  price
Кофе  300
Чай   150

«Вода» удалилась — её цена меньше 100.

DELETE против TRUNCATE

Чтобы быстро очистить таблицу целиком, в MySQL есть TRUNCATE TABLE. Он удаляет все строки разом, сбрасывает счётчик AUTO_INCREMENT и работает быстрее, чем DELETE, но его нельзя откатить в транзакции и нельзя ограничить условием.

TRUNCATE TABLE logs;   -- мгновенно очистить таблицу логов

Итог

  • INSERT добавляет строки; пакетная вставка нескольких строк эффективнее.
  • UPDATE и DELETE почти всегда требуют WHERE — иначе затронут всю таблицу.
  • TRUNCATE TABLE быстро чистит таблицу целиком и сбрасывает счётчик автонумерации.
  • Перед массовым изменением полезно проверить условие через SELECT с тем же WHERE.
Проверьте себя
1. Что произойдёт при выполнении UPDATE без WHERE?
Aничего не изменится
Bобновятся все строки таблицы
Cбудет синтаксическая ошибка
Dобновится только первая строка
2. Чем TRUNCATE TABLE отличается от DELETE без WHERE?
Aони идентичны
BTRUNCATE быстрее, сбрасывает AUTO_INCREMENT, но его нельзя ограничить условием
CTRUNCATE удаляет только одну строку
DDELETE нельзя откатить, а TRUNCATE можно
3. Какой приём помогает не ошибиться при массовом UPDATE/DELETE?
Aотключить индексы
Bсначала проверить тот же WHERE через SELECT
Cудалить первичный ключ
Dзапустить запрос дважды
Поддержать проект