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

SQLiteUPSERTと新しいRETURNING句に関するクイック投稿。

    RETURNING句

    ここで公式ドキュメントを読むことができます。

    多くの場合、データベースにレコードを挿入した後、データ(おそらくID)を返したいと思うことがあります。バージョン3.35.0以降 (2021-03-12)、SQLiteはRETURNINGをサポートしています 句。DELETEによって、変更されたデータベース行ごとに結果行(または特定の列)を返すことができます。 、UPDATE またはINSERT ステートメント。

    INSERT INTO customers (fullName, birthdateTimestamp, address) 
    VALUES ('Andrew Mitch', 643911868, '206 Grange Road, Gillingham') 
    RETURNING *;
    

    上記のクエリは、実行後、データベースに挿入されたすべての値とidを返します。 各行の。このようにして、別のSELECTを作成することを回避できます。 データベースへのクエリ。かなりきちんとしていますか?

    UPSERT条項

    ここで公式ドキュメントを読むことができます。

    もう1つの便利な機能は、UPSERTです。 句。これはバージョン3.24.0で追加されました (2018-06-04)そしてそれはINSERTを引き起こします UPDATEのように動作する またはno-opUNIQUE CONSTRAINTの場合 またはPRIMARY KEY CONSTRAINT 違反。

    詳細を説明するために、action_recordsがあるとします。 usersのユーザーによって実行されたすべてのアクションを保持するテーブル テーブル、特定のセッション用 。新しいアクションが発生したら、新しいaction_recordを挿入する必要があります エラーなし、または既存のANDが同じセッションタイムスタンプを持っている場合 (これはON CONFLICTによって処理されます 条項)、古いものを更新します。オプションでWHEREを追加することもできます no-opになるステートメント 、満たされていない場合。以下のクエリはそれを行う必要があります:

    -- Create users table and assign userID and sessionStartTimestamp as a UNIQUE CONSTRAINT.
    DROP TABLE IF EXISTS "action_records";
    CREATE TABLE IF NOT EXISTS "action_records" (
        "id" INTEGER NOT NULL,
        "userID" INTEGER NOT NULL,
        "sessionStartTimestamp" INTEGER NOT NULL,
        "errorMsg" TEXT,
        PRIMARY KEY("id" AUTOINCREMENT),
        FOREIGN KEY("userID") REFERENCES "users"("id") ON DELETE CASCADE,
        UNIQUE(userID, sessionStartTimestamp)
    );
    
    -- Insert new record or update the old one based on UNIQUE_CONSTRAINT OF userID & session_start_timestamp
    INSERT INTO action_records (userID, errorMsg, sessionStartTimestamp) 
    VALUES (258, null, 643911868) 
    ON CONFLICT(userID, sessionStartTimestamp) -- Conflict when a record for the same user and session exists
    DO UPDATE SET errorMsg = 'An error occured'
    WHERE errorMsg IS NOT NULL -- This will be a no-op in case there is already an error and you don't want to update it
    RETURNING *; -- Optionally adding RETURNING to retrieve any number of columns we want
    

    UPSERTとRETURNINGの組み合わせ

    私が本当に気に入ったのは、RETURNING *を追加するだけでこれらの句を組み合わせることができるという事実です。 クエリの最後に。このようにして、挿入または更新されたすべての行(または指定された列)が返されます。


    1. グリッドビューで複数の画像を設定できませんか?

    2. 列の値が明確でないすべての行を選択する方法

    3. AWSEC2からAWSRDSへのOracleデータベースの移行、パート2

    4. Android Studio getSlotFromBufferLocked:不明なバッファーエラー