Вставка или обновление уже существующей строки в БД

Ice_Sochi

Участник
Сообщения
709
Реакции
413
Доброго времени суток!

Опишу саму проблему и вводные:
Есть 3 столбца в таблице: config_id, client_id, count
Никакое из этих значений не является уникальным, один client_id может многократно повторяться с разными config_id и count
Задача состоит в том, что нужно добавить новую строку, если таковой нет с нужными client_id и config_id, и обновить count, если строка с client_id и config_id уже имеется

Есть простое решение:
Сделать запрос SELECT..., если результаты есть - обновить, если результатов нет - добавить строку
Но мне уж очень это не нравится и не хочется это делать.
Возможно, можно решить задачу исключительно посредством возможностей БД, не обрабатывая обратный вызов в плагине?
Работоспособность нужна и на mysql, и на sqlite, но хотябы на mysql

Я попробовал определенные способы из гугла, но большинство из них имеют требования - уникальность ключа, коей нет в моем случае

Попытки тыкнуть пальцем в небо:
FormatEx(sBuffer, sizeof(sBuffer), "INSERT INTO `%s` (`config_id`, `client_id`, `count`) VALUES ('227', '1', '7') ON CONFLICT (`config_id` AND `client_id`) DO UPDATE SET `count` = `count` + 7;", g_sTables[TABLE_RES]);
//ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint
    
FormatEx(sBuffer, sizeof(sBuffer), "INSERT OR IGNORE INTO `%s` (`config_id`, `client_id`, `count`) VALUES ('227', '1', '7') UPDATE `%s` SET `count` = `count` + 7 WHERE `client_id` = '1' AND `config_id` = '227';", g_sTables[TABLE_RES], g_sTables[TABLE_RES]);
//near "UPDATE": syntax error
    
FormatEx(sBuffer, sizeof(sBuffer), "REPLACE INTO `%s` (`config_id`, `client_id`, `count`) VALUES ('273', '1', `count` + '7');", g_sTables[TABLE_RES]);
//no such column: count

Буду чрезмерно благодарен за подсказки и помощь.
 

xstage

🏹
Сообщения
726
Реакции
754
SQL:
CREATE TABLE IF NOT EXISTS `test123` (
    `config_id` int NOT NULL,
    `client_id` int NOT NULL,
    `count` int NOT NULL,
    UNIQUE (`client_id`, `config_id`));
    

INSERT INTO `test123` (`config_id`, `client_id`, `count`) VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE `count` = `count` + 5;
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
SQL:
CREATE TABLE IF NOT EXISTS `test123` (
    `config_id` int NOT NULL,
    `client_id` int NOT NULL,
    `count` int NOT NULL,
    UNIQUE (`client_id`, `config_id`));
   

INSERT INTO `test123` (`config_id`, `client_id`, `count`) VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE `count` = `count` + 5;
Только mysql?
Пробую на sqlite, выдает near "DUPLICATE": syntax error
C-подобный:
"INSERT INTO `%s` (`config_id`, `client_id`, `count`) VALUES ('225', '1', '3') ON DUPLICATE KEY UPDATE `count` = `count` + 5;"
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
SQL:
CREATE TABLE IF NOT EXISTS `test123` (
    `config_id` int NOT NULL,
    `client_id` int NOT NULL,
    `count` int NOT NULL,
    UNIQUE (`client_id`, `config_id`));
   

INSERT INTO `test123` (`config_id`, `client_id`, `count`) VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE `count` = `count` + 5;
Спасибо большое
На sqlite заработал запрос
C-подобный:
"INSERT INTO `%s` (`config_id`, `client_id`, `count`) VALUES ('227', '1', '7') ON CONFLICT (`config_id` AND `client_id`) DO UPDATE SET `count` = `count` + 7;"
Решение было в установке UNIQUE при создании таблицы☺️
 
Сверху Снизу