这是个伤脑筋。
我在ON DUPLICATE KEY UPDATE的上下文中使用了ON DUPLICATE KEY UPDATE,它正在产生非常奇怪的结果。
假设一个表有两列三行,因此:
term | reference
0cm | 49-5;
10p | 890-1;
11s | 491-1;
16761 | 768-1;(尽管有数字,这些都是VARCHAR字符串。)
现在假设我们运行以下查询:
INSERT INTO dictionary (`term`,`references`)
VALUES
('0cm','35-6;'),
('10p','89-12;'),
('16761','491-7;')
ON DUPLICATE KEY UPDATE
`references` = CONCAT(`references`,'35-6;'),
`references` = CONCAT(`references`,'89-12;'),
`references` = CONCAT(`references`,'491-7;');因为term是唯一的索引,所以ON DUPLICATE KEY成为脚本的活动部分(对于未受影响的11s除外)。预期的行为是,我们的新价值观将被附加到现有的价值观中。
查询成功运行,但给出了以下意想不到的结果:
term | reference
0cm | 49-5;35-6;89-12;491-7;
10p | 890-1;35-6;89-12;491-7;
11s | 491-1;
16761 | 768-1;35-6;89-12;491-7;它连接了reference的每个值。
在reference执行其UPDATE之前,有什么方法可以“清除”它的UPDATE引用吗?
发布于 2020-08-13 20:09:21
如果没有重复的键,可以使用VALUES(references)获取要插入到该行中的值。
INSERT INTO dictionary (`term`,`references`)
VALUES
('0cm','35-6;'),
('10p','89-12;'),
('16761','491-7;')
ON DUPLICATE KEY UPDATE
`references` = CONCAT(`references`,VALUES(`references`));顺便说一句,你应该看看这个:Is storing a delimited list in a database column really that bad?
发布于 2020-08-13 20:08:03
INSERT INTO dictionary (`term`,`references`)
VALUES
('0cm','35-6;'),
('10p','89-12;'),
('16761','491-7;')
ON DUPLICATE KEY UPDATE
`references` = CASE term WHEN '0cm' THEN CONCAT(`references`,'35-6;')
WHEN '10p' THEN CONCAT(`references`,'89-12;')
WHEN '16761' THEN CONCAT(`references`,'491-7;')
END;或者简单的
INSERT INTO dictionary (`term`,`references`)
VALUES
('0cm','35-6;'),
('10p','89-12;'),
('16761','491-7;')
ON DUPLICATE KEY UPDATE
`references` = CONCAT(`references`, VALUES(references));发布于 2020-08-13 20:08:54
我怀疑你想:
INSERT INTO dictionary (term, references)
VALUES
('0cm','35-6;'),
('10p','89-12;'),
('16761','491-7;')
ON DUPLICATE KEY UPDATE
references = CONCAT_WS(';', references, VALUES(reference));当给出一个重复的reference时,这个附加到列term。注意,concat_ws()正确地处理了références最初是null的边缘情况。
https://stackoverflow.com/questions/63402471
复制相似问题