添加或更新MySQL

10 浏览
0 Comments

添加或更新MySQL

我不知道如何在我的特定表上执行以下操作。

假设我有以下table param,有3个列tcklabelvaluetck是我的主键。

数据每天发送一次。我想要更新现有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(); 
}
?>

0
0 Comments

问题出现的原因是在插入数据时,如果已经存在相同的主键或唯一键(在这里是字段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注入。

至于问题中提到的要完全同步并删除不在源数据中的数据,可以使用上述删除查询语句来实现。

如果出现了代码没有生效的问题,可能是没有正确地执行了删除查询语句,需要检查代码是否正确。

0
0 Comments

问题原因:需要在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中实现添加或更新数据的操作。

0