我有一个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/

10-11 03:31