Обновите, если существует, иначе вставьте (без ON DUPLICATE KEY UPDATE) - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь написать скрипт для вставки данных из 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!';
}

Я бы хотел, чтобы мой скрипт проверял каждую строку массива, если она существует, если да-> update, else -> insert.

Итак, в общем, что я хочу сделать (в псевдокоде):

Получить данные из API

для каждого[Запись API] {Запросите базу данных, чтобы узнать, существует ли уже ID

if (ID существует) {update record}

else if (ID не существует) (вставьте запись}

else {error}}

для каждой [записи БД] {проверить, находится ли идентификатор БД в данных API

if (идентификатор БД не в данных API) {Удалить запись из БД}

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

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

1 Ответ

0 голосов
/ 18 февраля 2019

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

С в документации MySQL :

Если указать условие ON DUPLICATE KEY UPDATE и строка, которая будет вставлена, приведет к дублированию значения в индексе UNIQUE или PRIMARY KEY, произойдет ОБНОВЛЕНИЕ старой строки

Необходимо создатьуникальный индекс столбца (столбцов), где вы хотите предотвратить дублирование.Это позволяет не только использовать синтаксис INSERT ... ON DUPLICATE KEY UPDATE, но и правильно отображать ваши требования в базе данных.

CREATE UNIQUE INDEX my_index ON mytable(column_1, column_2, ...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...