0

2 つのテーブルを持つ mysql db があります。最初のテーブルは「uniqueReferences」と呼ばれ、2 番目のテーブルは「du​​plicatedReferences」と呼ばれます。2 つのテーブルには、id フィールド (自動インクリメント) と Reference というフィールドの 2 つのフィールドしかありません。私が望むことは次のとおりです。「uniqueReferences」テーブルに ref を挿入しようとするときに、参照が既に存在する場合は、そのテーブルではなく、「duplicatedReferences」テーブルに挿入してください。

だから私が試したがうまくいかなかったのは次のとおりです。
1->「uniqueReferences」テーブルのフィールド参照を「unique」に設定します。
2->次のようにします

try{  
         $req = $prepared_insertQry_toUniqueRefTable -> execute(array(something));

         if($req == 0){
               $prepared_insertQry_toDuplicateRefTable->execute(array(something));
         }
     }
    catch(PDOException $e){echo $e->getMessage();}

残念ながら、これは機能していません。次のエラーがありますSQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry。誰かが助けてくれることを願っています。乾杯。マルク

4

3 に答える 3

1

受け取ったメッセージに基づくと、メッセージがであるPDOExceptionをキャッチしているように見えます... 1062 Duplicate entry。これは、'uniqueReferences'テーブルのテーブル制約が重複エントリを許可しないことを意味します。おそらく、そのテーブルに主キーがあるためです。これは良いことであり、この問題の解決が容易になります。

したがって、重複するエントリを挿入しようとするたびに例外がスローされる場合は、「duplicatedReferences」テーブルに挿入することがわかっているときです。スローされた例外が重複エントリによるものであることを確認したいだけです。

これを試して:

try
{
    $prepared_insertQry_toUniqueRefTable->execute(array(something));
}
catch (PDOException $e)
{
    if ($e->getCode() == 1062)
        $prepared_insertQry_toDuplicateRefTable->execute(array(something));
    else
        echo $e->getMessage();
}
于 2012-05-02T13:36:19.910 に答える
1

コードに沿った私のメモを参照してください:

    try{  
         $req = $prepared_insertQry_toUniqueRefTable -> execute(array(something));

         // this never executes because an Exception halts it here
         /*if($req == 0){
               $prepared_insertQry_toDuplicateRefTable->execute(array(something));
         }*/
     }
    catch(PDOException $e){
       // this catch grabs the exception and executes the code within instead
       // that code might log an error, echo the error message, or perform
       // alternative logic. In your case you want to execute alterntative logic
       // ie. your query
       $prepared_insertQry_toDuplicateRefTable->execute(array(something));

   }
于 2012-05-02T13:37:33.993 に答える
1

最初にデータを挿入してみてください。データがすでに存在する場合は、重複する行のテーブルに挿入してください。行が存在する場合は例外が生成されるため、この例外をキャッチして、代わりに複製されたテーブルに行を挿入できます。

try
{  
    $req = $prepared_insertQry_toUniqueRefTable -> execute(array(something));
}
catch (PDOException $e)
{
    // you can use the value of errorInfo[1] to check the actual generated error code
    if ($e->errorInfo[1] == 1062)
    {
        $prepared_insertQry_toDuplicateRefTable->execute(array(something));
    }
    else
    {
        // rethrow the exception as we're not handling it
        throw $e;
    }
}

あなたが望むものを得るためにそれを少し調整しなければならないかもしれません、しかしこれはそれの要点であるはずです。

于 2012-05-02T13:38:21.790 に答える