SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

Posting cepat tentang SQLite UPSERT dan klausa RETURNING baru.

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Android - coba buka kembali objek yang sudah ditutup:SQLiteQuery menggunakan loaderManager

  2. Cara melampirkan file .db dengan .apk android lain

  3. Gabung SQLite

  4. IntentService membekukan UI aplikasi saya

  5. Lihat konten file database di Android Studio