2015-08-25 66 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