MySQL ON DUPLICATE KEY UPDATE и CONCAT

У меня есть запрос (Code это PRIMARY KEY):

INSERT INTO table (Code, ... events)
  VALUES
    (1, ... CONCAT(events, 'BAR')),
    (2, ... CONCAT(events, 'BAR')),
    ...
  ON DUPLICATE KEY
    UPDATE ... events = VALUES(events)

Мое намерение состоит в том, чтобы вставляемое значение events объединялось с существующим значением, если для данного ключа уже есть строка.

В моем запросе, предполагая, что существующее значение events равно FOO, новые значения events всегда равны 'BAR' вместо 'FOOBAR'.

Каков правильный способ добиться того, чего я хочу?


person Павел Зорин    schedule 05.02.2018    source источник
comment
events = VALUES(events) где вы объединяете старое значение?   -  person Caramiriel    schedule 05.02.2018
comment
События CONCAT(events, '\nEDIT') вернут значение null в этот момент, поэтому вставка будет иметь значение null для событий.   -  person P.Salmon    schedule 05.02.2018
comment
Возможно, вы можете использовать функцию GROUP_CONCAT()   -  person Joe Taras    schedule 05.02.2018
comment
Пожалуйста, опубликуйте желаемый результат   -  person Joe Taras    schedule 05.02.2018


Ответы (1)


Чтобы соединить новое значение со старым, переместите вызов CONCAT в UPDATE:

INSERT INTO table (Code, ... events)
  VALUES
    (1, ... 'BAR'), -- insert plain values
    (2, ... 'BAR'),
    ...
  ON DUPLICATE KEY
    UPDATE ... events = CONCAT(IFNULL(events, ''), VALUES(events)) -- concat if key same

Одно примечание об использовании IFNULL(). Если ваш столбец events допускает значения NULL, бывает, что результат после обновления снова будет NULL, если существующее значение уже равно NULL. Чтобы предотвратить это, мы инициализируем значение с помощью IFNULL(events, '') перед добавлением дополнительных данных.

person Bohemian♦    schedule 05.02.2018