首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于重复键连接*列的每个*值

关于重复键连接*列的每个*值
EN

Stack Overflow用户
提问于 2020-08-13 20:04:04
回答 3查看 59关注 0票数 0

这是个伤脑筋。

我在ON DUPLICATE KEY UPDATE的上下文中使用了ON DUPLICATE KEY UPDATE,它正在产生非常奇怪的结果。

假设一个表有两列三行,因此:

代码语言:javascript
复制
term   | reference
0cm    | 49-5;
10p    | 890-1;
11s    | 491-1;
16761  | 768-1;

(尽管有数字,这些都是VARCHAR字符串。)

现在假设我们运行以下查询:

代码语言:javascript
复制
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除外)。预期的行为是,我们的新价值观将被附加到现有的价值观中。

查询成功运行,但给出了以下意想不到的结果:

代码语言:javascript
复制
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引用吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-13 20:09:21

如果没有重复的键,可以使用VALUES(references)获取要插入到该行中的值。

代码语言:javascript
复制
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?

票数 1
EN

Stack Overflow用户

发布于 2020-08-13 20:08:03

代码语言:javascript
复制
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;

或者简单的

代码语言:javascript
复制
INSERT INTO dictionary (`term`,`references`) 
VALUES 
('0cm','35-6;'),
('10p','89-12;'),
('16761','491-7;') 
ON DUPLICATE KEY UPDATE 
`references` = CONCAT(`references`, VALUES(references));
票数 1
EN

Stack Overflow用户

发布于 2020-08-13 20:08:54

我怀疑你想:

代码语言:javascript
复制
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的边缘情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63402471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档