Структура БД: ID | DATA | NUMB id - автоинкримент и PK data - некая строка данных (UNIQ) numb - расчетное значение Идея такова, что значение data должно быть уникально, но если такое значение существует, тогда нужно numb увеличить на еденицу, если не существует то добавить и присвоить numb = 1 И тут ка бы сам вопрос, как правильно построить логику, т.к. я, только изучаю БД, поэтому могу ошибаться в идее самом ответе (поведении) БД. Т.к. графа data уникальна, то при попытке добавить туда не уникальное значение возникнет ошибка, если работать через PDO с настройкой PHP: setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); в лог будут лететь исключения и как я понимаю данный подход не верен, т.к. я потенциально создаю ошибки. Другой вариант это работать через SELECT т.е. предварительно пытаться найти data и если данного значения нет, то записывать его, если есть то значение графы numb увеличивать на единицу. Что-то типа: PHP: $db->query("UPDATE `nameTable` SET `numb` = `numb` + 1 WHERE `data`= $dataString"); Но сдается мне что данная реализация кривая и должен существовать более элегантный способ реализации.
При каждом запросе типа INSERT... ON DUPLICATE KEY UPDATE... PK при AUTO_INCREMENT увеличивается, даже если фактически не происходило добавления, с этим как-то можно бороться? Ибо при при большом количестве обращений можно и BIGINT заполнить А PK необходим для связки с другими таблицами.
В общем это норм. Конкретно тут наверно InnoDB «чудит». В доках должно быть об этом написано. --- Добавлено --- Если сильно критично, попробуйте MyISAM использовать. Но, повторяю, на такие «мелочи» не стоит обращать особого внимания.
SELECT хорош для предварительных действий. В последовательном коде обычно сразу пытаются сделать изменение и смотрят на результат.
А где вообще можно посмотреть все существующие SQL команды? Т.к. в имеющейся литературе, да и в примерах в сети всё основано на нескольких основных командах. Всё для более менее интересной реализации требует поиска ответов на вопросы в форумах и чатах.
Ну как где? Здесь, конечно: https://dev.mysql.com/doc/refman/8.0/en/. Или здесь, если Maria DB используется (они совместимы, но у последней есть свои фишки) https://mariadb.com/kb/en/
--- Добавлено --- Если не понятно, там ниже еще уточняется как раз для твоего случая: Т.е. при инкременте тек. значение нужно предварительно сохранять, поэтому опять приходим к «разрыву атомарности».
@AlexandrS, предположим, что обновление будет выполняться во много раз чаще, чем добавление. Следовательно, можно выполнить update, проверить количество задействованных строк и, если оно нулевое - выполнить вставку, отловить ошибку, если кто-то вдруг уже успел добавить именно эту запись и выполнить update.