Php 更新(如果存在),否则插入(无重复密钥更新)

Php 更新(如果存在),否则插入(无重复密钥更新),php,mysql,sql,arrays,sql-update,Php,Mysql,Sql,Arrays,Sql Update,我试图编写一个脚本,将API中的数据插入数据库,但如果已经存在,请更新数据。接下来,如果数组中不存在数据,我想从数据库中删除数据。现在我已经很高兴,如果我能让更新生效的话 我已经在谷歌上搜索了两天,想找到解决我问题的方法,但我所做的一切都无济于事。现在我有了第一次插入工作,所以它会将初始调用写入DB,但所有后续调用都不会执行任何操作。不再有更新或插入 在我的例子中,ON DUPLICATE KEY UPDATE选项是不可能的,因为代码中提到的id不是我要插入的表的主键。这段代码只是一个示例,真实

我试图编写一个脚本,将API中的数据插入数据库,但如果已经存在,请更新数据。接下来,如果数组中不存在数据,我想从数据库中删除数据。现在我已经很高兴,如果我能让更新生效的话

我已经在谷歌上搜索了两天,想找到解决我问题的方法,但我所做的一切都无济于事。现在我有了第一次插入工作,所以它会将初始调用写入DB,但所有后续调用都不会执行任何操作。不再有更新或插入

在我的例子中,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不存在 插入记录 }

否则{ 错误 } }

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

如果DB id不在API数据中{ 从数据库中删除记录 }

否则{ 无所事事 } }


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

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

发件人:

如果指定ON DUPLICATE KEY UPDATE子句,并且要插入的行将导致唯一索引或主键中出现重复值,则会更新旧行

应该在要防止重复的列上创建唯一索引。它不仅使插入的使用成为可能。。。关于重复密钥更新语法,但这也是在数据库中表示需求的正确方法

CREATE UNIQUE INDEX my_index ON mytable(column_1, column_2, ...);
在我的例子中,ON-DUPLICATE-KEY-UPDATE选项是不可能的,因为代码中提到的id不是不需要的主键,它可以是唯一的索引。因为每个ID只需要一个条目,所以它应该有一个唯一的索引。