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-op
、UNIQUE 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 *
を追加するだけでこれらの句を組み合わせることができるという事実です。 クエリの最後に。このようにして、挿入または更新されたすべての行(または指定された列)が返されます。