0

重複があるかどうかを確認する代わりに、以下のスクリプトが 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());

}
4

2 に答える 2

1

コメントの主張が正しいと仮定すると、問題は、のフィールドに一意の制約または主キーを定義していないことですsurvey_ResponseDetail

ON DUPLICATE KEY UPDATE構文に関するMySQLドキュメントごと

ON DUPLICATE KEY UPDATE を指定し、UNIQUE インデックスまたは PRIMARY KEY で値が重複する行が挿入された場合、古い行の UPDATE が実行されます。

フィールドを一意として指定しない場合 (または、PK としてマークすることで間接的に指定しない場合)、MySQL は重複キーが何であるかを知る方法がありません。したがって、コマンドは期待どおりに機能していません。

どのフィールド (またはフィールドの組み合わせ) が行ごとに一意でなければならないか教えていただければsurvey_ResponseDetail、コードを使用して回答を編集し、これを機能させるために必要な制約を適用します。

于 2012-06-19T03:55:00.963 に答える
0

が機能するにはON DUPLICATE KEY UPDATE、更新された/新しく挿入されたフィールドのいずれかが主キーであるか、一意のインデックスが必要です。

単一のフィールドである必要はありません。複合キーは一意として定義することもできます。

于 2012-06-19T03:54:05.067 に答える