添加或更新MySQL
添加或更新MySQL
我不知道如何在我的特定表上执行以下操作。
假设我有以下table param
,有3个列tck
,label
,value
。tck
是我的主键。
数据每天发送一次。我想要更新现有tck
的值,如果发送的数据包含一个新的tck
,我想将其添加到表中...
希望我表达清楚...感谢您的帮助。
我正在使用的代码如下:
getMessage()); } $data = $_POST['field1']; $phpArray = json_decode($data, true); foreach ($phpArray as $u) { //$req = $bdd->prepare('INSERT INTO param (tck, label, value) VALUES(:tck, :label, :value)'); $req = $bdd->prepare('UPDATE param SET value=:value WHERE tck=:tck'); $req->execute(array( ':tck'=>$u['tck'], ':value'=>$u['value'] )); } ?>
这是我现在使用的代码:
getMessage()); } $data = $_POST['field1']; $phpArray = json_decode($data, true); $sourceTck = array(); foreach ($phpArray as $u) {array_push($sourceTck, $u['tck']); $req = $bdd->prepare("INSERT INTO param (tck, label, value) VALUES (:tck, :label, :value) ON DUPLICATE KEY UPDATE value=:value"); $req->execute( array( ':tck'=>$u['tck'], ':label'=>$u['label'], ':value'=>$u['value'] ) ); } if(count($sourceTck) > 0){ $sourceTckClause = implode("," , $sourceTck); $req = $bdd->prepare("DELETE FROM param WHERE tck NOT IN ($sourceTckClause)"); $req->execute(); } ?>
问题出现的原因是在插入数据时,如果已经存在相同的主键或唯一键(在这里是字段tck),会导致插入失败。为了解决这个问题,可以使用MySQL的ON DUPLICATE KEY语法,当行已经存在时更新行,而不是插入新行。
解决方法是在插入语句中使用ON DUPLICATE KEY UPDATE子句来更新value字段的值。代码如下:
$req = $bdd->prepare(" INSERT INTO param (tck, label, value) VALUES (:tck, :label, :value) ON DUPLICATE KEY UPDATE value=:value ");
另外,还需要绑定label的值。根据评论中的要求,如果要删除表中的数据,而不在源数据中,可以将源数据中的tck值存入一个数组,然后使用NOT IN子句运行删除查询语句。代码如下:
$sourceTck = array(); foreach ($phpArray as $u) { array_push($sourceTck, $u['tck']); $req = $bdd->prepare(" INSERT INTO param (tck, label, value) VALUES (:tck, :label, :value) ON DUPLICATE KEY UPDATE value=:value "); $req->execute( array(':tck'=>$u['tck'], ':label'=>$u['label'], ':value'=>$u['value']) ); } if(count($sourceTck) > 0){ $sourceTckClause = implode("," , array_map('intval', $sourceTck)); $bdd->query("DELETE FROM param WHERE tck NOT IN ($sourceTckClause)"); }
对于小规模的解决方案,可以将数组中的值转换为整数以防止SQL注入。
至于问题中提到的要完全同步并删除不在源数据中的数据,可以使用上述删除查询语句来实现。
如果出现了代码没有生效的问题,可能是没有正确地执行了删除查询语句,需要检查代码是否正确。
问题原因:需要在MySQL数据库中实现添加或更新数据的操作。
解决方法:
1. 使用MySQL的upsert或merge功能来实现添加或更新数据的操作。
2. 使用以下代码来实现:
INSERT INTO param VALUES (:tck, :label, :value) ON DUPLICATE KEY UPDATE value = :value -- change :label as well? , label = :label
以上代码将参数值(:tck, :label, :value)插入到param表中。如果在插入时发生重复键冲突,则更新value的值为新的值(:value)。
通过使用上述代码,可以在MySQL中实现添加或更新数据的操作。