我有一个查询(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'
。
达到我想要的正确方法是什么?
答案 0 :(得分:3)
要将新值连接到旧值,请将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, '')
初始化值。