如果存在则更新,否则插入(不执行ON DUPLICATE KEY UPDATE)

时间:2019-02-17 21:56:23

标签: php mysql sql arrays sql-update

我正在尝试编写脚本以从数据库中的API插入数据,但是如果已经存在,请更新数据。下一步,如果数组中不存在数据,我想从数据库中删除数据。 (现在,如果我能进行更新,已经很高兴了)

已经搜寻了2天,为我的问题找到了解决方案,但是我尝试过的任何方法都没有帮助。现在,我第一次进行插入操作,因此它将初始调用写入数据库,但是所有后续调用均不执行任何操作。不再有更新或插入。

在我的情况下,无法使用ON DUPLICATE KEY UPDATE选项,因为代码中提到的ID并非我要插入的表的主键。(此代码只是示例,实际的数据库是有点复杂,我不能更改表本身。

$content = file_get_contents($url);
$array = json_decode($content, true);
$sql = array(); 
$update = array(); 

foreach($array as $row) {

    // Create insert string
    $sql[] = '('.$row['userId'].', '.$row['id'].', "'.mysqli_real_escape_string($link, $row['title']).'", "'.mysqli_real_escape_string($link, $row['body']).'")';
    // Create update data
    $update[] = 'UPDATE TestDB.testTabel SET userId='.$row['userId'].', id='.$row['id'].', title= "'.mysqli_real_escape_string($link, $row['title']).'", body = "'.mysqli_real_escape_string($link, $row['body']).'" WHERE id = '.$row['id']. ';';

    $flag = 0;
    $query = "SELECT id FROM TestDB.testTabel WHERE id =".$row['id'];
    $result = mysqli_query($link, $query);

    if(mysqli_num_rows($result) > 0) {    
        $flag=1;
    }
    else {
        $flag=0;
    }
}

if($flag==1) {
    echo 'found!';
    mysqli_query($link, " ".implode('', $update));
    //print ''.implode('', $update);
}

else if ($flag==0) {
    echo 'not found!';
    mysqli_query($link, "INSERT INTO TestDB.testTabel (userId, id, title, body) VALUES ".implode(',', $sql));
    //    print 'INSERT INTO TestDB.testTabel (userId, id, title, body) VALUES '.implode(',', $sql);
}
else {
    echo 'ERROR!';
}

我希望脚本检查每个数组行是否存在,如果存在->更新,否则->插入。

所以基本上,我想做的事(用伪代码):

从API获取数据

每个[API记录]

{ 查询数据库以查看ID是否已经存在

如果(ID存在){ 更新记录 }

否则,如果(ID不存在)( 插入记录 }

else { 错误 } }

对于每个[数据库记录] { 检查数据库ID是否在API数据中

如果(数据库ID不在API数据中){ 从数据库中删除记录 }

else { 没做什么 } }

现在真的卡住了:(谁能帮帮我?

1 个答案:

答案 0 :(得分:0)

您要用于检查重复性的列不必是表的主键。

来自the MySQL documentation

  

如果您指定ON DUPLICATE KEY UPDATE子句,并且要插入的行将导致UNIQUE索引或PRIMARY KEY中的值重复,则会发生旧行的UPDATE

您应该在要防止重复的列上创建唯一索引。不仅可以使用INSERT ... ON DUPLICATE KEY UPDATE语法,而且这是在数据库中表示您的需求的正确方法。

CREATE UNIQUE INDEX my_index ON mytable(column_1, column_2, ...);