私はmysqlに "IF record EXISTS THEN UPDATE ELSE INSERT"を実装しようとしています。具体的には、私はDoctrine ORMでそれを行う方法を理解しなければなりません。"IF"を使ってmysql文を開始できますか?
ネイティブMySqlを使用する1つのソリューションは、「ON DUPLICATE KEY UPDATE」を使用することです。これは残念ながらDoctrineではサポートされていません。
もう1つの半解決策は、 "REPLACE INTO"構文を使用することです。 Doctrineはこれをサポートしていますが、REPLACEはレコードを更新しません。代わりにレコードを削除し、新しい自動インクリメントIDを使用して新しいレコードを作成します。これにより、自動インクリメントIDに依存すると悪い解決策になります。
私が操作しようとしているテーブルはINNODBなので、トランザクションを調べましたが、トランザクションの内部に同じルールが適用されているかどうかは完全には分かりません。
「IF(INSERT IGNORE INTOテーブルcritical_id
= $ id)トランザクション内でELSE(UPDATEテーブルSET field
= 'new_value')を終了しますか?
このようなことを言うことができない場合、この問題の解決策はありますか?
私は "重複キー"を使用する方法を見つけたので、これは最善の解決策だと思うので、私はこの回答を受け入れますが、mysql固有の用語を持たないトランザクションソリューションがあるかどうかを調べようとしています。 fwiw、タイトルに掲げられた質問は決して答えられなかった。答えは、IFでSELECT、INSERT、UPDATEステートメントを開始できないと思います。他のdbmsに存在するRecordcountというプロパティについて聞いたことがあります。私は、レコードが変更されたかどうかを教えてくれるmysqlの同等のもの、つまり "内部トランザクションカウンタ"を探していました。まだ見ている。 – seans