我正在处理一个必须处理插入记录的查询,并在主键重复时更新列值。
在我的情况下,列名称和值将作为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不是一个选项,因为其中一列的日期值在更新值时不应修改。
答案 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
,这将是该行新保存的值。