| |||
|
|
Для программистов. Маленькие радости Mariadb MySQL До последних версий Mariadb при попытке записать в таблицу уже имеющиеся там данные возвращала спокойную ошибку. Это ошибку обрабатывал скрипт PHP, и все было нормально. Но последние версии Mariadb (в частности 15.1 Distrib 10.6.11-MariaDB, for debian-linux-gnu x86_64) в таком случае стали выдавать настолько фатальную ошибку, которую уже не обработать, потому что на ней рушится сам вызвавший ее скрипт PHP. Потому что блять ну нельзя же пытаться записать данные, когда в таблице они уже есть! Шок! Паника! Вызывайте наряд Гестапо! Вот если, скажем, в поле varchar(11) попытаться записать телефонный номер в 12 символов — а вот это блять у нас можно, это вовсе никакая не ошибка, а дело житейское. Мы просто тихо обрежем последнюю цифру телефона и так запишем. Звоните теперь, ваш звонок очень важен для нас. Короче, я бегло погуглил и не нашел, что случилось, какой ебаный гений в очередной раз изобрел по дефолту всем бывшим пользователям MySQL очередной катаклизм, и как это лечить. То есть — в какую внутреннюю базу настроек надо чем залогиниться или какой ini-файл поправить, указав какую-нибудь свежевыебаную опцию duble_fatal_error_please_no_no_please=fa Я решил вопрос тупо, но эффективно: добавил запрос-проверку перед записью. Но старшие товарищи мне объяснили, что так поступать дорого, потому что в MySQL есть специально для этого опция INSERT IGNORE. Ок. Я вписал эту опцию, и вроде все заработало... Но со временем я стал замечать, что индекс автоинкремента в таблице неуёмно растет. Схуяль? И тут выяснилось, что INSERT IGNORE индекс по-любому увеличит — вне зависимости, создала она новую запись или нет. С какой целью она это делает, спросите вы? Да хуй знает. Это же Mariadb. Пример? Созданную таблицу с auto_increment и не позволяющим дублирование полем val полностью очищаем перед сеансом. Записываем val=1. Затем еще десяток раз пытаемся снова (и безуспешно) записать val=1 при помощи INSERT IGNORE. Потом записываем val=2.
Результат:
Сколько было попыток повторно записать val=1 — на сколько теперь увеличился счетчик id. Ну а если безуспешных попыток будет не десяток, а... ну, скажем, 125 (как вы догадались, я не случайно указал в примере tinyint, да еще без unsigned) — то всё, пиздец, вы ничего уже никогда в эту таблицу больше не запишете. Размерность счетчика исчерпалась на бесплодные попытки:
Если не это пиздец инженерной мысли, то что тогда? Сейчас, разумеется, в комменты набегут пожилые члены Cекты Свидетели Безгрешной Девы МарииДБ и расскажут нам, что это не бага, а фича. Что счетчик это вовсе не счетчик ячеек, а счетчик обращений. И что пики точёные расставлены на стуле для вашего удобства. Просто надо уметь ими пользоваться как мы, когда каждый день садимся на этот стул работать. |
|||||||||||||||