sqlite upsertと新しいreturn句についてのクイックポスト.



返還条項
あなたは公式ドキュメントを読むことができますhere .
何度も、我々は我々自身が我々のデータベースに記録を挿入した後に若干のデータ(おそらくID)を返すことを望むとわかります.バージョン2.0以降3.35.0 ( 2021 - 03 - 12 ) SQLiteサポートRETURNING によって変更されたデータベース行の結果行(または特定の列)を返すことができますDELETE , UPDATE or INSERT 文.
INSERT INTO customers (fullName, birthdateTimestamp, address) 
VALUES ('Andrew Mitch', 643911868, '206 Grange Road, Gillingham') 
RETURNING *;
上記のクエリは実行後、データベースに挿入されたすべての値をid 各行の.このように我々は別のことを避けることができますSELECT データベースへの問い合わせ.かなりきれいな、ええ?

upsert句
あなたは公式ドキュメントを読むことができますhere .
もう一つの良い小さい特徴はUPSERT 条項.これはバージョン2.0で追加されました3.24.0 ( 2018 - 06 - 04 )と原因INSERT 人のように振る舞うUPDATE またはno-op , Aの場合UNIQUE CONSTRAINT またはPRIMARY KEY CONSTRAINT 違反.
詳しく説明するために、あなたはaction_records で使用するすべてのアクションを保持するテーブルusers 特定のセッションのテーブル.新しいアクションが起動されるとき、あなたはaction_record エラーが発生しなかった場合、または存在していて、同じセッションタイムスタンプを持っている場合ON CONFLICT 古いものを更新します.必要に応じてWHERE aになるステートメント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との組み合わせを返す
私が本当に好きな1つのことは、単に追加することによってそれらの節を組み合わせることができるという事実ですRETURNING * クエリの最後に.挿入または更新された行(または指定された列)が返されます.