Добавить в столбец без первичного ключа и вставить, если он вообще не существует - PullRequest
0 голосов
/ 23 марта 2020

У меня есть таблица структуры:

+----+-----+-------+
| Id | Key | Value |
+----+-----+-------+
|  1 | A   | BCD   |
|  2 | B   | XYZ   |
+----+-----+-------+

Здесь id - это первичный ключ. Я хочу написать запрос, который добавляет строку к value против key, если он существует, или же должен вставить новую строку. Например, если мне нужно добавить PQR к значению, где key равно A, оно должно обновить BCD до BCDPQR. Но если key равен X, который не существует, он должен вставить новую строку с key как X и Value как PQR. Я ищу сделать это в одном запросе, а не несколько, а не процедуры. База данных: MySQL.

1 Ответ

0 голосов
/ 23 марта 2020

Вы не можете сделать это в одном операторе 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 для выполнения этой задачи не сложны и должны быть в рамках навыков любого разработчика программного обеспечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...