如何使在mysql中重复键更新时未更新的列无效

时间:2016-10-07 12:32:58

标签: php mysql json insert

我正在处理一个必须处理插入记录的查询,并在主键重复时更新列值。

在我的情况下,列名称和值将作为JSON对象,如下所示

{
    "col1": "val1",
    "col2": "val2",
    .....
}

我的表有5列,在JSON对象中,我可能只有2列或3列。

现在如何取消未使用查询更新的列?

这是我到目前为止所尝试过的。

$columns = implode(', ', array_keys($requirement));
$values = array_values($requirement);
$placeholders = implode(', ', array_fill(0, count($values), '?'));

$updatedReq = $requirement;
unset($updatedReq['requirement_id']);
unset($updatedReq['buyer_id']);

$updated = array_keys($updatedReq);
array_walk($updated, function(&$value, $key) { $value .= '= ?'; });
$updatedPlaceholders = implode(', ', $updated);
$updatedVal = array_values($updatedReq);

$finalVal = array_merge($values, $updatedVal); 

$sql = "INSERT INTO requirements ($columns) VALUES ($placeholders) ".
                    "ON DUPLICATE KEY UPDATE $updatedPlaceholders";
$db->query($sql);
$db->executeWithArray($finalVal);

$ requirement是一个关联数组,其中键作为列名,值是要在表中更新的值

表格结构

CREATE TABLE requirement(
       id integer PRIMARY KEY AUTO_INCREMENT,
       col1 varchar(20) DEFAULT NULL,
       col2 varchar(20) DEFAULT NULL,
       col3 varchar(20) DEFAULT NULL,
       col4 varchar(20) DEFAULT NULL,
       col5 varchar(20) DEFAULT NULL,
       created datetime DEFAULT CURRENT_TIMESTAMP,
       updated datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)

注意:REPLACE INTO不是一个选项,因为其中一列的日期值在更新值时不应修改。

1 个答案:

答案 0 :(得分:1)

使用ON DUPLICATE KEY函数扩展您的VALUES()以包含您想要影响的所有列:

ON DUPLICATE KEY UPDATE
    `val1` = VALUES(`val1`),
    `val2` = VALUES(`val2`),
    `val3` = VALUES(`val3`),
    `val4` = VALUES(`val4`),
    `val5` = VALUES(`val5`)

如果您的INSERT未传递给定列的值,则VALUES(`unpassed_column`)将产生NULL,这将是该行新保存的值。