sql >> データベース >  >> RDS >> Mysql

行が存在する場合はMySQLを更新し、そうでない場合は挿入

    これがUpsertと呼ばれるものです。 。 MySQLの構文はかなり奇妙ですが、次のように実行できます。

    INSERT INTO eventcounter (userID, eventID, activityID) VALUES(1,1,1)
    ON DUPLICATE KEY UPDATE
      activityID = VALUES(activityID)
    

    ただし、重複するPKに対してのみ機能します(任意のフィールドに対しては機能しません)。したがって、この場合は、userIDの場合にのみ機能します。 およびeventID PKを作成し、activityIDのみを変更する必要があります

    それ以外の場合は、次のようなIF-ELSEルートを使用できます。

    DECLARE mycount INT;
    SET mycount = (SELECT COUNT(*) FROM eventcounter WHERE userID=1 AND eventID=1);
    IF mycount > 0 THEN
      UPDATE eventcounter SET activityID=1 WHERE userID=1 AND eventID=1;
    ELSE
      INSERT INTO eventcounter (userID, eventID, activityID) VALUES(1,1,1);
    END IF;
    

    免責事項:完全にテストされていないコード



    1. 値が長すぎて文字が変化しない(N)

    2. GoogleCloudSQLのoptimizer_search_depth

    3. HibernateはタイムスタンプをUTCとして永続化/ロードするように強制します

    4. 変異テーブルの回避策としてのOracle