2016-10-07 71 views
1

我正在处理一个查询,该查询必须处理插入记录并在主键重复时更新列值。如何取消没有使用mysql中的重复键更新进行更新的列

在我的情况列名和值来作为JSON对象像下面

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

我的表具有5列和在JSON对象我可以仅具有2或3列出的5

现在,我该如何取消未更新查询的列?

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

$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); 

$要求是一个关联数组键作为列名和值在表

表结构

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不是一个选项因为其中一列具有日期值,在更新值时不应该修改该日期值。

+0

请问您能否提供表格结构? – rbr94

+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和这将是该行新保存的值。

+0

您的意思是col1,col2 ....而不是val1,val2 ...,对吗? –

+0

无论您的列名是什么,在测试时可能会混淆它们。所以...是的。 –

+0

谢谢......这有帮助 –