2015-08-25 4 views
1

У меня есть эти таблицы:Подготовленные отчеты: Дублированный обновления ключа с Где

stundenplan 
+----+---------+-------+--------+---------+---------+------+ 
| id | user_id | tag | stunde | fach | lehrer | raum | 
+----+---------+-------+--------+---------+---------+------+ 
| 1 |  1 |  1 |  1 | MATH | SM  | 101 | 
| 2 |  1 |  1 |  2 | MATH | SM  | 101 | 
| 3 |  1 |  1 |  3 | MATH | SM  | 101 | 
| 4 |  1 |  1 |  4 | MATH | SM  | 101 | 
| 5 |  1 |  1 |  5 | MATH | SM  | 101 | 
| 6 |  1 |  1 |  6 | MATH | SM  | 101 | 
| 7 |  1 |  2 |  1 | MATH | SM  | 101 | 
| 8 |  1 |  2 |  2 | MATH | SM  | 101 | 
| .. |  ... | ... | ... |  ... |  ... | ... | 

users 
+---------+----------+---- 
| user_id | username | ... 
+---------+----------+---- 
|  1 | User1 | ... 
+---------+----------+---- 

Мой запрос (который не имеет смысла для меня, потому что user_id отсутствует в части обновления):

$sql = $db->prepare(" 
INSERT INTO stundenplan 
    (tag, stunde, user_id, fach, lehrer, raum) 
VALUES 
    (?, ?, ?, ?, ?, ?) 
ON DUPLICATE KEY UPDATE 
    fach = VALUES(fach), 
    lehrer = VALUES(lehrer), 
    raum = VALUES(raum) 
"); 
$sql->bind_param('iiissi', $input_tag, $input_stunde, $input_fach, $input_lehrer, $input_raum); 

Если бы я должен вставить что-то запрос будет таким:

INSERT INTO stundenplan (tag, stunde, user_id, fach, lehrer, raum) VALUES (?, ?, ?, ?, ?, ?) 

Если бы я должен обновить запрос будет таким:

UPDATE stundenplan SET fach = ?, lehrer = ?, raum = ? WHERE user_id = ? 

Как я могу объединить эти два запроса в один, как я пытался раньше?

+0

Что является уникальным ключом Stundenplan таблицы? –

+0

в настоящее время тег, stunde. есть тег, stunde, user_id лучше? – Bernd

+0

Является ли user_id студентом? Или это техническая вещь (пользователь, который создал/изменил план)? –

ответ

0

Я сделал это только на SQL части (ваш запрос правильно, но я протянул ключ от user_id):

INSERT INTO stundenplan 
     (tag, stunde, user_id, fach, lehrer, raum) 
    VALUES 
     (1,1,1,'MATH_NEW','SM',101) 
    ON DUPLICATE KEY UPDATE 
     fach = VALUES(fach), 
     lehrer = VALUES(lehrer), 
     raum = VALUES(raum); 

Пожалуйста, проверьте демо ниже. Он использует ON DUPLICATE KEY UPDATE для части сборки схемы и статические значения для вставки (дубликат по значениям 1,1,1). После выполнения инструкции select вы можете увидеть, что значения правильно обновлены.

DEMO HERE

Проблема заключается в том, что вы не можете изменить UPDATE условия в запросе (они точно так же, как от обнаруженного дубликата). Таким образом, есть несколько возможных решений, все они содержат 2 запросы и транзакции:

  • Удаление повторяющихся строк из stundenplan и вставить их снова
  • Вставьте не дублированные строки, а затем обновить дубликаты.

Я также нашел приличную статью о необычных вставок/обновлений HERE

Смежные вопросы