Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql ON重复键连接列的*每个*值_Mysql_String_Sql Update_Sql Insert_On Duplicate Key - Fatal编程技术网

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
。再次感谢。是的,
引用
在声明外键时使用。