INSERT в MySQL — 100 жизненных приёмов

100 реальных приёмов работы с MySQL INSERT: от базовых до продвинутых кейсов.

🟢 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.


 

Понравилась статья? Поделиться с друзьями: