Обновите, если существует, иначе вставьте (без обновления ключа ON DUPLICATE KEY)

Я пытаюсь написать скрипт для вставки данных из 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) { Удалить запись из бд }

еще { ничего не делать } }

Действительно застрял сейчас :( кто может мне помочь?

The ON DUPLICATE KEY UPDATE option is not possible in my case, because the id mentioned in my code is not the primary key Не обязательно, это может быть уникальный индекс. И поскольку вам нужна только одна запись для каждого идентификатора, она все равно должна иметь уникальный индекс.
tkausl 17.02.2019 22:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
275
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Столбец, который вы хотите использовать для проверки дублирования, не обязательно должен быть первичным ключом таблицы.

Из документация по MySQL :

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, ...);

Другие вопросы по теме