Какой правильный синтаксис для INSERT INTO ... ON DUPLICATE KEY UPDATE в MySQL? - PullRequest
2 голосов
/ 21 февраля 2012


структура моей таблицы (MySQL / каждая такая же, как показано ниже)

+-------+--------------+------+------+-------------------+
| Field | Type         | Null | Key  | Default           |
+-------+--------------+------+------+-------------------+
| id    | int(11)      | NO   | PRI  | AUTO INCREMENT    | 
| lesson| varchar(255) | NO   |      | LESSON_NAME       | 
| exam  | char(50)     | NO   |UNIQUE| NO DEFAULT        |
| quest | text         | NO   |      | NO DEFAULT        |
| answer| text         | NO   |      | NO DEFAULT        |
| note  | text         | NO   |      | NO DEFAULT        |
+-------+--------------+------+------+-------------------+

и я публикую некоторые значения, чтобы добавить эту таблицу через ajax ($ post) - PHP 5.0
в файле database.php есть функция для получения опубликованных данных и добавления в таблицу

function update_table ($proper_table, $name, $question, $answer, $note) {
$sql = "INSERT INTO $proper_table (id, lesson, exam, quest, answer, note) VALUES ('', '', $name, $question,$answer,$note) ON DUPLICATE KEY UPDATE exam = $name, quest = $question, answer = $answer, note = $note";
$result= mysql_query($sql)or die(mysql_error());
}

Переменная $ Proper_table берется другой переменной, чтобы добавить эту запись в корректную таблицу.
(ПРИМЕЧАНИЕ. Исходные поля и переменные таблицы отличаются (турецкий), чтобы быть более понятным, я переведен на английский, но синтаксис такой же, как вы видите.)
Вопрос: Я хочу проверить, что если есть запись, что поле экзамена такое же, то все эти переменные будут использоваться для обновления этой записи, в противном случае пусть функция поместит эту запись в соответствующую таблицу как новую запись.
Но я получаю ошибку, как показано ниже

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 

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

Ответы [ 5 ]

6 голосов
/ 21 февраля 2012
function update_table ($proper_table, $name, $question, $answer, $note) {
    $sql = "INSERT INTO $proper_table (lesson, exam, quest, answer, note) VALUES ('', '$name', '$question','$answer','$note') ON DUPLICATE KEY UPDATE quest = VALUES(quest), answer = VALUES(answer), note = VALUES(note)";
   $result= mysql_query($sql)or die(mysql_error());
}

Просто разбив это, я подробно опишу изменения

$sql = "INSERT INTO $proper_table 

// Removed the PK AI field - don't need to specify this
(lesson, exam, quest, answer, note)     

// Likewise removed PK field, and added quotes around the text fields
VALUES ('', '$name', '$question','$answer','$note')    
ON DUPLICATE KEY UPDATE 

// If you specify VALUES(fieldName) it will update with the value you specified for the field in the conflicting row
// Also removed the exam update, as exam is the UNIQUE key which could cause conflicts so updating that would have no effect
quest = VALUES(quest), answer = VALUES(answer), note = VALUES(note)";
0 голосов
/ 21 февраля 2012

Вы должны сделать это так

<?php
function update_table($proper_table, $name, $question, $answer, $note, $id) {

    $sqlQuery = "INSERT INTO '".$proper_table."' SET
                    name        =       '".$name."',
                    question        =   '".$question."',
                    answer      =       '".$answer."',
                    note        =       '".$note."' WHERE id = '".$id."'";

    $result= mysql_query($sqlQuery)or die(mysql_error());

}
?>
0 голосов
/ 21 февраля 2012

id автоинкремент, так что, вероятно, вы не хотите устанавливать пустую строку как id.

Попытка:

$sql = "INSERT INTO $proper_table (lesson, exam, quest, answer, note) VALUES ('', $name, $question,$answer,$note) ON DUPLICATE KEY UPDATE exam = $name, quest = $question, answer = $answer, note = $note";
0 голосов
/ 21 февраля 2012

С этим запросом, когда вы добавляете ON DUPLICATE KEY UPDATE ... он будет обновляться, когда идентификаторы совпадают с идентификатором, который вы отправляете, в этом случае вы не отправляете идентификатор в качестве параметра, поэтому он никогда не будет обновляться потому что у вас есть идентификатор с автоинкрементом.

Решением может быть то, что вы читаете таблицу, где экзамен равен отправляемому параметру, что-то вроде этого:

    SELECT id FROM $proper_table;

Если это значение равно NULL, то вы выполняете вставку, если оно не равно NULL, то вы обновляете, принимая в качестве параметра идентификатор, который вы получаете от выбора

0 голосов
/ 21 февраля 2012

Например, вам нужно заключить строковые переменные в одинарные кавычки в SQL '$name'.В противном случае mysql считает, что вы ссылаетесь на имена столбцов.

...