Изменить запись, если нет создать - 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, и соответственно ничего не обновил), либо ничего, если запрос с ошибкой.
На деле этот способ уже сущестыующие обновляет, но новых не создает т.к. UPDATE всегда возвращает 1.
2. В источниках указано, что REPLACE удаляет старую запись если она существует.
На деле тупо создает новую запись в любом случае.
3. Не знаю как он работает но сказано "если нужно вставить, а если уже есть - изменить.".
На деле создает новую запись в любом случае.
4. Опять же не знаю как работает, но источник гласит "Иногда требуется вставить запись в таблицу, если её там до сих пор нет".
Результат тот же - новая строка не зависимо, от того есть ли другая.
Напишите, пожалуйста, рабочий способ, или укажите на ошибки в любом из этих 4.
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."'");
mysql_query("REPLACE INTO Progress ( Id_Stud, Id_Subj, Mark) VALUES ('".$User_Data['id']."','".$id."', '".$Mark."')");
mysql_query("INSERT INTO Progress ( Id_Stud, Id_Subj, Mark) VALUES ('".$User_Data['id']."','".$id."', '".$Mark."') ON DUPLICATE KEY UPDATE Mark='".$Mark."';");
mysql_query("INSERT IGNORE INTO Progress SET `Id_Stud` = '".$User_Data['id']."', `Id_Subj` = '".$id."', `Mark` = '".$Mark."'");
Решение задачи: «Изменить запись, если нет создать»
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')
Объяснение кода листинга программы
- Проверяется существование записи в таблице
conf
сid_usr
равным$id
с помощью запросаSELECT * FROM
confWHERE
id_usr= '
.$id.'
- Если запись существует, то обновляется значение поля
background
с помощью запросаUPDATE
confSET
background= '
.$bgn.' WHERE
id_usr= '
.$id.'
- Если запись не существует, то вставляется новая запись в таблицу
conf
с помощью запросаINSERT INTO
conf(
background,
id_usr) VALUES ('$bgn', '$id')
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д