Я пытаюсь написать скрипт для вставки данных из API в базу данных, но если он уже существует, обновите данные. Кроме того, я хочу удалить данные из базы данных, если данные не существуют в массиве. (На данный момент уже счастлив, если бы я мог просто работать с обновлением)
Гуглил два дня, чтобы найти решение моей проблемы, но ничего из того, что я пробовал, не помогло. На данный момент у меня работает вставка в первый раз, поэтому он запишет начальный вызов в БД, но все последующие вызовы ничего не делают. Больше никаких обновлений и вставок.
Опция ON DUPLICATE KEY UPDATE в моем случае невозможна, потому что идентификатор, упомянутый в моем коде, не является первичным ключом таблицы, в которую я буду вставлять. (Этот код является просто примером, реальная база данных немного больше сложный и я не могу менять таблицы сам).
$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 не существует) ( вставить запись }
еще { ошибка } }
для каждой [записи БД] { проверить, находится ли идентификатор БД в данных API
if (идентификатор БД отсутствует в данных API) { Удалить запись из бд }
еще { ничего не делать } }
Действительно застрял сейчас :( кто может мне помочь?






Столбец, который вы хотите использовать для проверки дублирования, не обязательно должен быть первичным ключом таблицы.
If you specify an ON DUPLICATE KEY UPDATE clause and a row to be inserted would cause a duplicate value in a UNIQUE index or PRIMARY KEY, an UPDATE of the old row occurs
Вы должны создать уникальный индекс для столбцов, где вы хотите предотвратить дублирование. Это не только позволяет использовать синтаксис INSERT ... ON DUPLICATE KEY UPDATE, но и является правильным способом представления вашего требования в базе данных.
CREATE UNIQUE INDEX my_index ON mytable(column_1, column_2, ...);
The ON DUPLICATE KEY UPDATE option is not possible in my case, because the id mentioned in my code is not the primary keyНе обязательно, это может быть уникальный индекс. И поскольку вам нужна только одна запись для каждого идентификатора, она все равно должна иметь уникальный индекс.