Klausa PENGEMBALIAN
Anda dapat membaca dokumen resmi di sini.
Sering kali kita mendapati diri kita ingin mengembalikan beberapa data (mungkin id) setelah memasukkan catatan ke dalam database kita. Sejak versi 3.35.0
(2021-03-12), SQLite mendukung RETURNING
klausa, yang memungkinkan Anda untuk mengembalikan baris hasil (atau kolom tertentu) untuk setiap baris database yang dimodifikasi dengan DELETE
, UPDATE
atau INSERT
pernyataan.
INSERT INTO customers (fullName, birthdateTimestamp, address)
VALUES ('Andrew Mitch', 643911868, '206 Grange Road, Gillingham')
RETURNING *;
Kueri di atas, setelah dieksekusi, akan mengembalikan kepada kita setiap nilai yang dimasukkan ke dalam database, bersama dengan id
dari setiap baris. Dengan cara ini kita dapat menghindari membuat SELECT
lain permintaan ke database. Cukup rapi, kan?
Klausa UPSERT
Anda dapat membaca dokumen resmi di sini.
Fitur kecil lainnya yang bagus adalah UPSERT
ayat. Ini telah ditambahkan dalam versi 3.24.0
(2018-06-04) dan menyebabkan INSERT
untuk berperilaku seperti UPDATE
atau no-op
, jika terjadi UNIQUE CONSTRAINT
atau PRIMARY KEY CONSTRAINT
pelanggaran.
Untuk menguraikannya, anggaplah Anda memiliki action_records
tabel yang menampung semua tindakan yang dipicu oleh pengguna di users
tabel, untuk sesi tertentu . Saat aksi baru dipicu, Anda ingin menyisipkan action_record
. baru tanpa kesalahan, atau, jika ada DAN memiliki stempel waktu sesi yang sama (ini ditangani oleh ON CONFLICT
klausa), perbarui yang lama. Anda juga dapat secara opsional menambahkan WHERE
pernyataan yang akan menghasilkan no-op
, jika tidak terpenuhi. Kueri di bawah ini harus melakukannya:
-- 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
Gabungan UPSERT &RETURNING
Satu hal yang sangat saya sukai adalah fakta bahwa Anda dapat menggabungkan klausa tersebut hanya dengan menambahkan RETURNING *
di akhir kueri. Dengan cara ini setiap baris (atau kolom tertentu), baik yang disisipkan atau diperbarui, akan dikembalikan.