2012-06-19 42 views
0

我有一個問題,不是檢查是否有重複,而是下面的腳本只是將行插入到mysql中,根本沒有更新。我試過一遍又一遍,但總是有重複。ON DUPLICATE KEY仍然複製插入

我究竟在做什麼錯在這裏?

if ($completeStatus == "0") { 

// Get the default questions responses and insert into database 
$questionsAnswered = $_GET['questions']; 
foreach($questionsAnswered as $key => $answers){ 
    $query = "INSERT INTO survey_ResponseDetail (responseHeader, 
         questionID, 
         questionText, 
         ansLikelihood, 
         ansExpConsq, 
         ansRepRisk, 
         currWayMitigate 
        ) 
VALUES ('$ResponseHeader', 
     '$key', 
     'test1', 
     '$answers[1]', 
     '$answers[2]', 
     '$answers[3]', 
     '$answers[4]' 
     ) 
ON DUPLICATE KEY UPDATE ansLikelihood = '$answers[1]', 
         ansExpConsq = '$answers[2]', 
         ansRepRisk = '$answers[3]', 
         currWayMitigate = '$answers[4]', 
         id = LAST_INSERT_ID(id)"; 
    $dbresult = mysql_query($query) or die ('Database Error (' . mysql_errno() . ') ' . mysql_error()); 

} 
+3

不得不問。您在survey_ResponseDetail表上確實有PK或其他唯一約束。對? – JohnFx

+0

我對mySQL的知識現在非常弱,所以我不知道。如果我在創建表格時必須設置它,那麼不需要。 –

回答

1

假設您在評論中的斷言是正確的,問題是您尚未在survey_ResponseDetail的任何字段上定義唯一約束或主鍵。

每MySQL的載文對ON DUPLICATE KEY UPDATE語法

如果你指定ON DUPLICATE KEY UPDATE,並且插入一行是 會在唯一索引或主鍵,一個 UPDATE的導致重複值舊行被執行。

如果你沒有指定一個字段是唯一的(或者通過將它標記爲PK來間接地這樣做),那麼MySQL無法知道重複密鑰是什麼。因此,這個命令並沒有達到你期望的水平。

如果您告訴我survey_ResponseDetail中每行的唯一字段(或字段組合)必須是唯一的,我將使用代碼編輯我的答案,以應用您需要的約束來完成此項工作。

+0

這裏是我的領域的屏幕截圖http://cl.ly/HTYe 你能詳細說明究竟使用唯一行嗎? –

+0

在設計良好的數據庫中,您需要具有唯一標識行的列或組合列。用非技術術語。如果您想告訴某人如何在數據庫中查找某一行,您需要告訴他們哪些信息,以免與另一行發生混淆。另一種表述方式是:此表中的一行代表什麼? – JohnFx

+0

所以基本上我已經在表中的行ID了? –

0

對於ON DUPLICATE KEY UPDATE工作,更新/新插入的一個字段必須是主鍵或上應該有一個唯一索引。

它不需要是單個字段。複合鍵也可以被定義爲唯一的。

相關問題