ON DUPLICATE KEY仍然复制插入

时间:2012-06-19 03:42:06

标签: mysql

我有一个问题,而不是检查是否有重复,下面的脚本只是将行插入mysql,根本没有更新。我一次又一次地尝试过,但总会有重复。

我到底错在了什么?

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());

}

2 个答案:

答案 0 :(得分:1)

假设您在评论中的断言是正确的,问题是您没有在survey_ResponseDetail中的任何字段上定义唯一约束或主键。

根据ON DUPLICATE KEY UPDATE语法

的MySQL Documentaiton
  

如果指定ON DUPLICATE KEY UPDATE,则插入一行   会导致UNIQUE索引或PRIMARY KEY中的重复值   执行旧行的更新。

如果你没有将某个字段指定为唯一(或通过将其标记为PK来间接地这样做),那么MySQL无法知道重复的密钥是什么。因此,命令没有达到预期的效果。

如果您告诉我survey_ResponseDetail中每行的哪个字段(或字段组合)必须是唯一的,我将使用代码编辑我的答案,以应用您需要的约束来使其工作。

答案 1 :(得分:0)

要使ON DUPLICATE KEY UPDATE起作用,其中一个更新/新插入的字段必须是主键,或者应该有一个唯一索引。

它不一定是一个领域。复合键也可以定义为唯一。