2012-06-19 41 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工作,更新/新插入的一个字段必须是主键或上应该有一个唯一索引。

它不需要是单个字段。复合键也可以被定义为唯一的。

相关问题