Изменить запись, если нет создать - MySQL

Узнай цену своей работы

Формулировка задачи:

Таблица id int(11) Id_Stud int(11) Id_Subj int(11) Mark text Нужно по запросу найти строку с определенными Id_Stud и Id_Subj и изменить в ней Mark, если строки с такими Id_Stud и Id_Subj нет, то создать ее. Пытался несколькими способами: 1. В некоторых источниках было написано, что UPDATE возвращает кол-во обновленных строк, но как я ни пытался, он всегда возвращает либо 1 (даже если небыло строки с такими Id_Stud и Id_Subj, и соответственно ничего не обновил), либо ничего, если запрос с ошибкой.
if( mysql_query("UPDATE Progress SET Mark=".$Mark." WHERE Id_Stud='".$User_Data['id']."' && Id_Subj='".$id."'")== NULL)
     mysql_query("INSERT INTO Progress SET `Id_Stud` = '".$User_Data['id']."', `Id_Subj` = '".$id."', `Mark` = '".$Mark."'");
На деле этот способ уже сущестыующие обновляет, но новых не создает т.к. UPDATE всегда возвращает 1. 2. В источниках указано, что REPLACE удаляет старую запись если она существует.
mysql_query("REPLACE INTO Progress ( Id_Stud, Id_Subj, Mark) VALUES ('".$User_Data['id']."','".$id."', '".$Mark."')");
На деле тупо создает новую запись в любом случае. 3. Не знаю как он работает но сказано "если нужно вставить, а если уже есть - изменить.".
mysql_query("INSERT INTO Progress ( Id_Stud, Id_Subj, Mark) VALUES ('".$User_Data['id']."','".$id."', '".$Mark."') ON DUPLICATE KEY UPDATE Mark='".$Mark."';");
На деле создает новую запись в любом случае. 4. Опять же не знаю как работает, но источник гласит "Иногда требуется вставить запись в таблицу, если её там до сих пор нет".
mysql_query("INSERT IGNORE INTO Progress SET `Id_Stud` = '".$User_Data['id']."', `Id_Subj` = '".$id."', `Mark` = '".$Mark."'");
Результат тот же - новая строка не зависимо, от того есть ли другая. Напишите, пожалуйста, рабочий способ, или укажите на ошибки в любом из этих 4.

Решение задачи: «Изменить запись, если нет создать»

textual
Листинг программы
IF EXISTS (SELECT * FROM `conf` WHERE `id_usr` = '".$id."')
UPDATE `conf` SET `background` = '".$bgn."' WHERE `id_usr` = '".$id."'
ELSE
INSERT INTO `conf` (`background`, `id_usr`) VALUES ('$bgn', '$id')

Объяснение кода листинга программы

  1. Проверяется существование записи в таблице conf с id_usr равным $id с помощью запроса SELECT * FROMconfWHEREid_usr= '.$id.'
  2. Если запись существует, то обновляется значение поля background с помощью запроса UPDATEconfSETbackground= '.$bgn.' WHEREid_usr= '.$id.'
  3. Если запись не существует, то вставляется новая запись в таблицу conf с помощью запроса INSERT INTOconf(background,id_usr) VALUES ('$bgn', '$id')

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы