我有一个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
插入。。。对于重复的键UPDATE语句,可以使用UPDATE子句中的VALUES(col_name)函数引用语句的INSERT部分中的列值。换言之,UPDATE子句中的值(col_name)指的是将要插入的col_name的值,没有发生重复的键冲突。此函数在多行插入中特别有用。VALUES()函数仅在INSERT语句的ON DUPLICATE KEY UPDATE子句中有意义,否则返回NULL。
您应该能够使用$datafields
函数引用在values()
中使用的值
SQL:ON DUPLICATE KEY UPDATE val3 = CONCAT_WS(';',val3,VALUES(val3))
关于php - PHP,MySQL-开启重复键时从输入数组追加到单元格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36992361/