INSERT в MySQL. Введение
INSERT в MySQL — основа загрузки данных. Ниже собраны 100 реальных приёмов: от одиночных вставок до массовых миграций, upsert-стратегий, JSON, партиций, временных таблиц, триггеров и аналитических сценариев. Код компактный, длинные выражения перенесены вручную для читабельности.
Синтаксис
INSERT [INTO] tbl (cols)
VALUES (..),(..),...;
INSERT [INTO] tbl
SET col1=expr1,col2=expr2;
INSERT [INTO] tbl (cols)
SELECT exprs FROM other_tbl ...;
INSERT [INTO] tbl (cols)
VALUES (...)
ON DUPLICATE KEY UPDATE col=expr,...;
Типовая конструкция
INSERT INTO users (name,email,active)
VALUES ('Ivan','ivan@example.com',1);
100 примеров
1. Новая учётная запись
INSERT INTO users (name,email)
VALUES ('Anna','anna@example.com');
2. Каталог без явных столбцов
INSERT INTO products
VALUES (DEFAULT,'USB Flash 32GB',599.00,'in stock');
3. Массовая загрузка контактов
INSERT INTO users (name,email)
VALUES ('Oleg','oleg@ex.com'),('Masha','masha@ex.com'),('Petr','petr@ex.com');
4. Текущее время входа
INSERT INTO logins (user_id,login_time)
VALUES (5,NOW());
5. Пропущенный телефон как NULL
INSERT INTO contacts (name,phone)
VALUES ('Vera',NULL);
6. Форма через SET
INSERT INTO users
SET name='Roma',email='roma@ex.com',active=1;
7. Генерация UUID
INSERT INTO api_keys (user_id,token,created_at)
VALUES (7,UUID(),UTC_TIMESTAMP());
8. Значение по умолчанию
INSERT INTO products (name,price,created_at)
VALUES ('SSD 512GB',699.00,DEFAULT);
9. Автоинкремент без id
INSERT INTO notes (user_id,body)
VALUES (10,'First note');
10. Чёткая типизация чисел
INSERT INTO payments (user_id,amount,currency)
VALUES (12,CAST(19.95 AS DECIMAL(10,2)),'EUR');
11. Склейка ФИО
INSERT INTO users (name,email)
VALUES (CONCAT('Ivan',' ','Petrov'),'ivan.p@ex.com');
12. Обрезка пробелов
INSERT INTO tags (slug)
VALUES (TRIM(LOWER(' Summer Sale ')));
13. Код страны из e-mail
INSERT INTO profiles (user_id,country)
VALUES (5,RIGHT('support@ex.de',2));
14. Расчёт НДС
INSERT INTO invoices (total,vat)
VALUES (1200,ROUND(1200*0.20,2));
15. Формат даты
INSERT INTO events (title,start_at)
VALUES ('Standup',STR_TO_DATE('2025-09-01 09:00','%Y-%m-%d %H:%i'));
16. Генерация пароля
INSERT INTO auth (login,pass_hash)
VALUES ('demo',SHA2('demo123',256));
17. Коллатинг при записи
INSERT INTO dict (term)
VALUES ('straße' COLLATE utf8mb4_german2_ci);
18. Регистрозависимый логин
INSERT INTO users (username)
VALUES (BINARY 'Admin');
19. Число из строки
INSERT INTO metrics (user_id,score)
VALUES (3,CAST('42' AS UNSIGNED));
20. Экранирование кавычек
INSERT INTO comments (body)
VALUES ('It\'s OK');
Еще 20 примеров
21. Архив старых заказов
INSERT INTO orders_archive (id,user_id,total,created_at)
SELECT id,user_id,total,created_at FROM orders
WHERE created_at<CURDATE()-INTERVAL 365 DAY;
22. Нормализация стран
INSERT INTO countries (code,name)
SELECT DISTINCT country_code,country_name FROM raw_countries;
23. Выбор топ-покупателей
INSERT INTO vip_users (user_id,spent)
SELECT user_id,SUM(total) FROM orders
GROUP BY user_id HAVING SUM(total)>=10000;
24. Копия структуры с фильтром
INSERT INTO hot_products (id,name,price)
SELECT id,name,price FROM products WHERE price>=1000;
25. Перенос последних N
INSERT INTO recent_logins (user_id,logged_at)
SELECT user_id,login_time FROM logins ORDER BY login_time DESC LIMIT 100;
26. Заполнение справочника
INSERT INTO categories (name)
SELECT DISTINCT category FROM products;
27. Слияние из CSV-буфера
INSERT INTO emails (addr)
SELECT addr FROM staging_emails WHERE valid=1;
28. Псевдонимы при переносе
INSERT INTO authors (id,full_name)
SELECT a_id,CONCAT(first,' ',last) FROM legacy_authors;
29. Трансформация валют
INSERT INTO invoice_eur (invoice_id,total_eur)
SELECT id,ROUND(total*rate,2) FROM invoice_usd CROSS JOIN fx WHERE fx.ccy='EUR';
30. Снятие дубликатов
INSERT INTO clean_users (email)
SELECT MIN(email) FROM dirty_users GROUP BY LOWER(email);
31. Перекладка в партицию месяца
INSERT INTO sales_2025_09 (order_id,total)
SELECT id,total FROM sales WHERE created_at BETWEEN '2025-09-01' AND '2025-09-30';
32. Сбор последних статусов
INSERT INTO last_status (entity_id,status,at)
SELECT t.entity_id,t.status,t.at FROM (
SELECT entity_id,status,at,ROW_NUMBER() OVER(PARTITION BY entity_id ORDER BY at DESC) rn
FROM status_log
) t WHERE t.rn=1;
33. Подготовка витрины
INSERT INTO dwh_daily (d,orders_sum,users_cnt)
SELECT CURDATE(),SUM(total),COUNT(DISTINCT user_id) FROM orders
WHERE created_at>=CURDATE()-INTERVAL 1 DAY;
34. Фильтр через EXISTS
INSERT INTO selected_users (user_id)
SELECT u.id FROM users u WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id=u.id AND o.total>=500
);
35. Обновление при конфликте email
INSERT INTO users (email,name,last_seen)
VALUES ('ann@ex.com','Ann',NOW())
ON DUPLICATE KEY UPDATE name=VALUES(name),last_seen=VALUES(last_seen);
36. Накапливаемая статистика
INSERT INTO daily_stats (d,views)
VALUES (CURDATE(),1)
ON DUPLICATE KEY UPDATE views=views+1;
37. Слияние цен каталога
INSERT INTO prices (sku,price,updated_at)
VALUES ('SKU42',799.00,UTC_TIMESTAMP())
ON DUPLICATE KEY UPDATE price=VALUES(price),updated_at=VALUES(updated_at);
38. Принудительный пропуск ошибок
INSERT IGNORE INTO emails (addr)
VALUES ('dup@ex.com'),('dup@ex.com');
39. Замена записи целиком
REPLACE INTO feature_flags (name,enabled)
VALUES ('beta_search',1);
40. Сброс и перезапись кеша
REPLACE INTO cache (ckey,cval,expires_at)
VALUES ('users_top','[...]',UTC_TIMESTAMP()+INTERVAL 1 HOUR);
Еще 20 примеров
41. Логирование уникального события
INSERT IGNORE INTO unique_hits (uid,visited_at)
VALUES (123,UTC_TIMESTAMP());
42. Приращение счётчика по ключу
INSERT INTO counters (name,ctr)
VALUES ('clicks',1)
ON DUPLICATE KEY UPDATE ctr=ctr+1;
43. Обновление JSON поля
INSERT INTO user_meta (user_id,meta)
VALUES (7,JSON_OBJECT('theme','dark'))
ON DUPLICATE KEY UPDATE meta=JSON_SET(meta,'$.theme','dark');
44. Апсерт по составному ключу
INSERT INTO stock (warehouse_id,sku,qty)
VALUES (1,'SKU-1',10)
ON DUPLICATE KEY UPDATE qty=qty+VALUES(qty);
45. Апсерт рейтинга
INSERT INTO ratings (user_id,product_id,stars,updated_at)
VALUES (5,42,4,NOW())
ON DUPLICATE KEY UPDATE stars=VALUES(stars),updated_at=VALUES(updated_at);
46. Замена по натуральному ключу
REPLACE INTO currencies (code,name)
VALUES ('EUR','Euro');
47. Игнор незаполненных e-mail
INSERT IGNORE INTO newsletter (email)
VALUES (''),('user@ex.com');
48. Апсерт геоточки
INSERT INTO geo_points (id,lat,lng)
VALUES (UUID(),52.3702,4.8952)
ON DUPLICATE KEY UPDATE lat=VALUES(lat),lng=VALUES(lng);
49. Слияние профилей по username
INSERT INTO profiles (username,bio)
VALUES ('maria','hello')
ON DUPLICATE KEY UPDATE bio=VALUES(bio);
50. Черновик через временную таблицу
CREATE TEMPORARY TABLE tmp_users AS
SELECT * FROM users WHERE 1=0;
INSERT INTO tmp_users (name,email)
VALUES ('Test','test@ex.com');
51. Буфер для импорта
CREATE TEMPORARY TABLE staging (email VARCHAR(255));
INSERT INTO staging (email)
VALUES ('a@ex.com'),('b@ex.com');
52. Дедупликация через временную
CREATE TEMPORARY TABLE tmp AS
SELECT MIN(id) id,email FROM raw GROUP BY LOWER(email);
INSERT INTO clean (id,email)
SELECT id,email FROM tmp;
53. Транзакционная загрузка
START TRANSACTION;
INSERT INTO orders (user_id,total)
VALUES (9,199.00);
INSERT INTO payments (order_id,amount)
VALUES (LAST_INSERT_ID(),199.00);
COMMIT;
54. Фиксация+откат примера
START TRANSACTION;
INSERT INTO sandbox (k,v)
VALUES ('try','1');
ROLLBACK;
55. Захват строки на время
START TRANSACTION;
SELECT * FROM settings WHERE id=1 FOR UPDATE;
INSERT INTO audit (event,created_at)
VALUES ('lock',NOW());
COMMIT;
56. Изоляция уровня чтения
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
INSERT INTO debug_log (m,at)
VALUES ('ok',NOW());
COMMIT;
57. Повтор при ошибке дедлока
SET @tries=0; REPEAT SET @tries=@tries+1;
INSERT INTO queue (payload,created_at)
VALUES ('{}',NOW());
UNTIL @tries>=1 END REPEAT;
58. Сбор метрик выполнений
INSERT INTO job_runs (job,started_at)
VALUES ('daily',NOW());
59. Оптимистичный подход
INSERT INTO versioned (id,ver,payload)
VALUES (100,1,'{}');
60. Снятие снапшота данных
INSERT INTO snapshots (entity,body,created_at)
SELECT 'orders',JSON_ARRAYAGG(JSON_OBJECT('id',id,'total',total)),NOW()
FROM orders WHERE created_at>=CURDATE();
Еще 20 примеров
61. Предзаполнение справочника ролей
INSERT INTO roles (id,name)
VALUES (1,'admin'),(2,'editor'),(3,'viewer');
62. Аудит массовой загрузки
INSERT INTO audit (event,details,created_at)
VALUES ('bulk_load','products 5k rows',NOW());
63. Загрузка плана партиции
INSERT INTO part_plan (ym,rows_cnt)
VALUES (DATE_FORMAT(CURDATE(),'%Y-%m'),0);
64. JSON-профиль пользователя
INSERT INTO user_meta (user_id,meta)
VALUES (3,JSON_OBJECT('lang','ru','tz','Europe/Amsterdam'));
65. Вытягивание атрибутов при переносе
INSERT INTO order_items (order_id,sku,qty)
SELECT id, jt.product_id, jt.qty FROM orders, JSON_TABLE(order_json,'$.items[*]'
COLUMNS(product_id INT PATH '$.id', qty INT PATH '$.qty')) AS jt;
66. Валидный JSON
INSERT INTO json_store (k,j)
VALUES ('cfg',JSON_MERGE_PATCH('{}','{"a":1}'));
67. Локация пользователя
INSERT INTO user_geo (user_id,lat,lng,updated_at)
VALUES (7,52.37,4.89,NOW());
68. Полнотекстовая инверсия
INSERT INTO search_index (post_id,term)
SELECT id,LOWER(word) FROM posts CROSS JOIN terms WHERE MATCH(title,body)
AGAINST ('+mysql +guide' IN BOOLEAN MODE);
69. Unicode-псевдоним
INSERT INTO nicknames (user_id,nick)
VALUES (9,'𝙼𝚢𝚂𝚀𝙻_гуру');
70. Нормализация телефонов
INSERT INTO phones (user_id,phone)
SELECT id,REGEXP_REPLACE(raw_phone,'[^0-9]+','') FROM raw_users;
71. Гео-кластеризация (псевдо)
INSERT INTO clusters (label,cnt)
SELECT CONCAT('cell_',FLOOR(lat*10),'_',FLOOR(lng*10)),COUNT(*) FROM user_geo GROUP BY 1;
72. Сохранение файла как BLOB
INSERT INTO files (name,bin)
VALUES ('pic.jpg',UNHEX('FFD8FFE000104A46...'));
73. Настройки в JSON
INSERT INTO settings (k,v)
VALUES ('theme',JSON_OBJECT('dark',true));
74. JSON-массив тегов
INSERT INTO post_meta (post_id,tags)
VALUES (42,JSON_ARRAY('mysql','insert','guide'));
75. Обновление части JSON через upsert
INSERT INTO cfg (name,body)
VALUES ('home',JSON_OBJECT('ver',1))
ON DUPLICATE KEY UPDATE body=JSON_SET(body,'$.ver',COALESCE(JSON_EXTRACT(body,'$.ver'),0)+1);
76. Формат телефона с кодом страны
INSERT INTO phones_norm (phone_e164)
VALUES (CONCAT('+31',REGEXP_REPLACE('06-12 34 56 78','[^0-9]+','')));
77. Справочник валют UTF-8
INSERT INTO currencies (code,name)
VALUES ('RUB','Рубль'),('UAH','Гривна');
78. Сырые логи в JSON-строке
INSERT INTO raw_logs (payload,received_at)
VALUES ('{"ev":"click","id":1}',NOW());
79. Большая партия значений
INSERT INTO big_table (val)
VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
80. Пакетные точки контроля
START TRANSACTION;
INSERT INTO t (v)
VALUES (1),(2),(3);
COMMIT;
Еще 20 примеров
81. Аналитическая загрузка из витрины
INSERT INTO mart_daily (d,orders,sum_total)
SELECT d,orders,sum_total FROM stage_mart WHERE d=CURDATE();
82. Выборочная партия по условию
INSERT INTO t (v)
SELECT v FROM src WHERE v%2=0;
83. Балансировка по партициям
INSERT INTO sales (id,total,created_at)
VALUES (NULL,99.00,'2025-09-13');
84. Семплирование данных
INSERT INTO sample (id,grp)
SELECT id,IF(RAND()<0.1,'test','control') FROM users;
85. Сбор уникальных доменов
INSERT INTO email_domains (dom)
SELECT DISTINCT SUBSTRING_INDEX(email,'@',-1) FROM users;
86. Заполнение lookup-таблицы
INSERT INTO sku_lookup (sku,product_id)
SELECT DISTINCT sku,id FROM products;
87. Имитация LOAD DATA через SELECT
INSERT INTO ip_log (addr)
SELECT addr FROM staging_ip;
88. Генерация тестовых строк
INSERT INTO dummy (txt)
SELECT CONCAT('row_',n) FROM seq_1_to_1000;
89. Аудит настройки
INSERT INTO audit (event,user_id,created_at)
VALUES ('settings_change',3,NOW());
90. Журнал безопасности
INSERT INTO sec_events (code,details,at)
VALUES ('PASSWORD_RESET','user:42',UTC_TIMESTAMP());
91. Запрет на дубликаты через IGNORE
INSERT IGNORE INTO uniq_login (login)
VALUES ('admin');
92. Учёт переполнений
INSERT INTO tiny_counter (id,ctr)
VALUES (1,LEAST(ctr+1,255));
93. Защёлка разовой операции
INSERT IGNORE INTO once_flags (name,created_at)
VALUES ('init_done',NOW());
94. Шард по модулю
INSERT INTO shard_0 (user_id,payload)
SELECT id,JSON_OBJECT('p',1) FROM users WHERE id%4=0;
95. Сеансовые переменные в значениях
SET @tz='Europe/Amsterdam';
INSERT INTO settings (k,v)
VALUES ('tz',@tz);
96. Лимитированный перенос последних
INSERT INTO top_recent (id,dt)
SELECT id,created_at FROM events ORDER BY created_at DESC LIMIT 50;
97. Паддинг до нужной длины
INSERT INTO secrets (k)
VALUES (LPAD('42',8,'0'));
98. Индикатор деактивации
INSERT INTO flags (name,enabled)
VALUES ('feature_x',0);
99. Лента событий в реальном времени
INSERT INTO event_stream (topic,data,ts)
VALUES ('orders',JSON_OBJECT('id',LAST_INSERT_ID()),NOW());
100. Резервная копия одной строки
INSERT INTO backup_users (id,name,email)
SELECT id,name,email FROM users WHERE id=42;
Заключение
Подборка охватывает реальные сценарии: одиночные и массовые вставки, переносы через SELECT, апсерты, IGNORE/REPLACE, JSON, партиции, временные таблицы, транзакции и безопасность. Подробности и нюансы смотрите в официальной документации MySQL.