Вы не можете сделать это в одном операторе SQL, потому что, как указано выше, INSERT ... ON DUPLICATE KEY UPDATE работает, только если ваш столбец KEY
является частью уникального ключа. Так что вам придется написать некоторый код.
Сначала запустите транзакцию, потому что вам нужно будет заблокировать строку, пока вы не подтвердите:
START TRANSACTION;
Выполните чтение блокировки для строки:
SELECT * FROM MyTable WHERE `KEY` = 'A' FOR UPDATE;
Это либо вернет строку, либо не будет строк. Вы напишите код, чтобы проверить результат на эту разницу.
Если SELECT действительно возвратил строку, то ОБНОВИТЬ строку с идентификатором, который вы только что выбрали:
UPDATE MyTABLE SET VALUE = CONCAT(VALUE, 'PQR') WHERE ID = ?
Если строки не было извлекается с помощью SELECT, затем ВСТАВЛЯЕТ новую строку:
INSERT INTO MyTABLE SET `KEY` = 'A', VALUE = 'PQR';
Не забудьте COMMIT, что снимет блокировку строки, чтобы другой клиент мог выполнить свою работу.
COMMIT;
Код и логика c для выполнения этой задачи не сложны и должны быть в рамках навыков любого разработчика программного обеспечения.