0

mysqlに「IFrecordEXISTSTHENUPDATEELSEINSERT」を実装しようとしています。具体的には、DoctrineORMでそれを行う方法を理解する必要があります。

ネイティブMySqlを使用する1つの解決策は、「ONDUPLICATEKEYUPDATE」を使用することです。残念ながら、これはDoctrineではサポートされていません。

もう1つの半解決策は、「REPLACEINTO」構文を使用することです。Doctrineはこれをサポートしていますが、REPLACEはレコードを更新せず、代わりにレコードを削除して新しいレコードを作成します(新しい自動インクリメントIDを使用)。このため、私のように自動インクリメントIDに依存する場合は悪い解決策です。 。

私が操作しようとしているテーブルはINNODBであるため、トランザクションを調べましたが、トランザクションの外部で適用されるのと同じルールがトランザクションの内部で適用されるかどうかは完全には理解していません。

トランザクション内で「IF(INSERTIGNORE INTO table critical_id= $ id)THEN exit ELSE(UPDATE table SET field='new_value')」と言うことはできますか?

そのようなことが言えない場合、この問題の解決策はありますか?

4

3 に答える 3

1

「ONDUPLICATEKEYUPDATE」を機能させる方法を見つけるか、2つのステートメントの使用に切り替えます。最初にSELECTを使用して既存の行を検索し、次に必要に応じてUPDATEまたはINSERTを実行します。

上記の作業を行うストアドプロシージャを作成する以外は、これが唯一の選択肢です。

于 2009-07-16T00:49:52.923 に答える
1

「挿入または更新」は「アップサート」と呼ばれます。「upsertmysql」をグーグルで検索すると、解決策がほとんどないことがわかります。

  1. 2ステップ、挿入、更新、バリエーション
  2. 「重複するキーの更新について」
  3. 交換

そして、おそらくもう少しですが、それらのほとんどはバリエーションです。

トランザクションを使用すると、SQLは次のようになります。

    UPDATE xxx SET (x1, x2) = (y1, y2) WHERE id = myid;
    IF found THEN
        RETURN;
    END IF;
    BEGIN
        INSERT INTO xxx (x1, x2) VALUES (y1, y2);
        RETURN;
    EXCEPTION WHEN unique_violation THEN
    --##Do nothing, or you can put this whole sql code
    --##in a LOOP and it will loop over and try update again
    END;

このコードは、私のpostgresql関数の1つから削除されています。InnoDBはこれをサポートしていないと思いますが、私は間違っているかもしれません。

于 2009-07-16T01:20:52.043 に答える
0

INSERTIGNOREINTOについてはすでに説明しました。これはあなたのニーズを満たしていませんか?

http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html

于 2009-07-15T22:03:05.467 に答える