MySQL 关于重复密钥更新和 CONCAT

MySQL ON DUPLICATE KEY UPDATE and CONCAT

我有一个问题(CodePRIMARY 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'

实现我想要的正确方法是什么?

要将新值连接到旧值,请将 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, '') 初始化 值。