Mysql ON重复键连接列的*每个*值
这是一个令人头痛的问题 我在重复密钥更新的Mysql ON重复键连接列的*每个*值,mysql,string,sql-update,sql-insert,on-duplicate-key,Mysql,String,Sql Update,Sql Insert,On Duplicate Key,这是一个令人头痛的问题 我在重复密钥更新的上下文中使用CONCAT,结果非常奇怪 假设存在一个包含两列三行的表,因此: term | reference 0cm | 49-5; 10p | 890-1; 11s | 491-1; 16761 | 768-1; (尽管有数字,但这些都是VARCHAR字符串。) 现在假设我们运行以下查询: INSERT INTO dictionary (`term`,`references`) VALUES ('0cm','35-6;'
上下文中使用CONCAT
,结果非常奇怪
假设存在一个包含两列三行的表,因此:
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;');
由于术语
是唯一的索引,因此重复键上的将成为脚本的活动部分(不受影响的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;
它连接了引用的每个值
在重复键上的执行其更新之前,是否有办法“清除”参考
参考
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));
或者干脆
INSERT INTO dictionary (`term`,`references`)
VALUES
('0cm','35-6;'),
('10p','89-12;'),
('16761','491-7;')
ON DUPLICATE KEY UPDATE
`references` = CONCAT(`references`, VALUES(references));
我怀疑你想要:
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));
当给出重复的术语
时,这会附加到列参考
。请注意,concat_ws()
正确处理边缘情况,其中références
最初为null
,我怀疑您想要:
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));
当给出重复的术语
时,这会附加到列参考
。请注意,concat_ws()
正确地处理边缘情况,其中références
最初为null
使用值(引用)
获取在该行没有重复键的情况下要插入到该行中的值
INSERT INTO dictionary (`term`,`references`)
VALUES
('0cm','35-6;'),
('10p','89-12;'),
('16761','491-7;')
ON DUPLICATE KEY UPDATE
`references` = CONCAT(`references`,VALUES(`references`));
顺便说一句,您应该阅读以下内容:使用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`));
顺便说一句,你应该读一下:@Barmar谢谢。删除。回答得好,阿基娜,谢谢。但是巴尔马的干净多了。请记住,这可能是一次添加1000行。尽管如此,WHEN/THEN仍然是一个很好的策略。@paraluie CASE技术更为通用-有时在ODKU中指定的值可能与插入的值无关。VALUES()用法是一种特殊情况(当然,也是最常见的)。这就是为什么我给出这两种变体。明白。很高兴有这种变体。@Barmar谢谢。删除。回答得好,阿基娜,谢谢。但是巴尔马的干净多了。请记住,这可能是一次添加1000行。尽管如此,WHEN/THEN仍然是一个很好的策略。@paraluie CASE技术更为通用-有时在ODKU中指定的值可能与插入的值无关。VALUES()用法是一种特殊情况(当然,也是最常见的)。这就是为什么我给出这两种变体。明白。很高兴有这样的变体。巴尔马和比尔·卡温给了我明显的提示?我在听!我会好好读一读的。不过,为了进行这项工作,并希望得到社会的熏陶,我会先把这件事办完。我将在这里添加我的更新。谢谢,宾果。成功了。我不知道引用当前在reference
字段中的值的正确方法。谢谢你的课。顺便说一句,“reference”必须是一个限制性术语,除非在每种情况下都勾选它:references
。再次感谢。是的,引用
在声明外键时使用。Barmar和Bill Karwin给了我明显的提示吗?我在听!我会好好读一读的。不过,为了进行这项工作,并希望得到社会的熏陶,我会先把这件事办完。我将在这里添加我的更新。谢谢,宾果。成功了。我不知道引用当前在reference
字段中的值的正确方法。谢谢你的课。顺便说一句,“reference”必须是一个限制性术语,除非在每种情况下都勾选它:references
。再次感谢。是的,引用
在声明外键时使用。