我有一个MySQL表,类似
sometable
id | val1 | val2 | val3
1 | ... | ... | ...
2 | ... | ... | ...
3 | ... | ... | ...
其中val1
被设置为UNIQUE
密钥。
我正在同时插入多行。数字是可变的,因此查询以以下方式构建:
for(...building array earlier in code...){
$arr[] = array('val1' => $somVal[$i][0],
'val2' => $somVal[$i][1],
'val3' => $somVal[$i][2]);
}
$datafields = array('val1', 'val2', 'val3');
$insert_values = array();
$qms = array();
foreach($arr as $d){
$qms[] = '(' . dbplaceholders('?', sizeof($d)) . ')';
$insert_values = array_merge($insert_values, array_values($d));
}
$db = new PDO(...);
$db->beginTransaction();
$stmt = $db->prepare('INSERT INTO sometable (' . implode(',', $datafields ) . ')
VALUES ' . implode(',', $qms) .
' ON DUPLICATE KEY UPDATE val3 = "New Val3 Value"');
if($stmt->execute($insert_values)){
$db->commit();
}
其中:
function dbplaceholders($text, $count=0, $separator=","){
$result = array();
if($count > 0){
for($x=0; $x<$count; $x++){
$result[] = $text;
}
}
return implode($separator, $result);
}
这很好用。当val1
重复时,val3
中的值将更改为"New Val3 value"。
但这不是我想要的。
我想要的是将新的val3
添加到当前的末尾
类似于:
ON DUPLICATE KEY UPDATE val3 = val3 + ";" + $newVal3Val
但问题是$newVal3Val
埋在$insert_values
的内部。
当发现重复时,如何使用分号分隔符将新的val3
附加到当前值?
http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values
在INSERT中。。。在DUPLICATE KEY UPDATE语句中,可以使用UPDATE子句中的VALUES(col_name)函数引用该语句INSERT部分的列值。换句话说,UPDATE子句中的VALUES(col_name)指的是在没有发生重复密钥冲突的情况下将插入的col_name的值。此函数在多行插入中特别有用。VALUES()函数仅在INSERT语句的ON DUPLICATE KEY UPDATE子句中有意义,否则返回NULL。
您应该能够使用values()
函数引用您在$datafields
中使用的值
SQL:ON DUPLICATE KEY UPDATE val3 = CONCAT_WS(';',val3,VALUES(val3))