SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

Đăng nhanh về SQLite UPSERT và điều khoản RETURNING mới.

Điều khoản QUAY LẠI

Bạn có thể đọc các tài liệu chính thức tại đây.

Nhiều lần chúng tôi thấy mình muốn trả lại một số dữ liệu (có thể là id) sau khi chèn các bản ghi vào cơ sở dữ liệu của chúng tôi. Kể từ phiên bản 3.35.0 (2021-03-12), SQLite hỗ trợ RETURNING mệnh đề này cho phép bạn trả về một hàng kết quả (hoặc các cột cụ thể) cho mỗi hàng cơ sở dữ liệu đã sửa đổi bằng một DELETE , UPDATE hoặc INSERT tuyên bố.

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

Truy vấn trên, sau khi thực thi, sẽ trả về cho chúng tôi mọi giá trị được chèn trong cơ sở dữ liệu, cùng với id của mỗi hàng. Bằng cách này, chúng tôi có thể tránh tạo một SELECT khác truy vấn đến cơ sở dữ liệu. Khá gọn gàng phải không?

Điều khoản UPSERT

Bạn có thể đọc các tài liệu chính thức tại đây.

Một tính năng nhỏ hay khác là UPSERT mệnh đề. Điều này đã được thêm vào phiên bản 3.24.0 (2018-06-04) và nó gây ra INSERT hoạt động giống như một UPDATE hoặc no-op , trong trường hợp UNIQUE CONSTRAINT hoặc PRIMARY KEY CONSTRAINT sự vi phạm.

Để giải thích rõ hơn, hãy giả sử rằng bạn có action_records bảng chứa tất cả các hành động được kích hoạt bởi người dùng trong users bảng, cho một phiên cụ thể . Khi một hành động mới được kích hoạt, bạn muốn chèn một action_record mới không có lỗi hoặc nếu hiện tại VÀ có cùng dấu thời gian phiên (điều này được xử lý bởi ON CONFLICT ), cập nhật cái cũ. Bạn cũng có thể tùy chọn thêm một WHERE câu lệnh sẽ dẫn đến no-op , nếu không được đáp ứng. Truy vấn bên dưới sẽ thực hiện điều đó:

-- 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 kết hợp

Một điều tôi thực sự thích là bạn có thể kết hợp các mệnh đề đó bằng cách chỉ cần thêm RETURNING * ở cuối truy vấn. Bằng cách này, bất kỳ hàng nào (hoặc các cột được chỉ định), được chèn hoặc cập nhật, sẽ được trả về.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gói đã đăng 50 chúc rượu. Không hiển thị thêm

  2. Cách hoạt động của SQLite Ifnull ()

  3. Cơ sở dữ liệu Android Room, truy xuất giá trị cụ thể của bản ghi mới nhất đã nhập

  4. SQLite AUTOINCREMENT

  5. Làm cách nào tôi có thể đọc dữ liệu từ một DB được mã hóa bằng SQLiteAssetHelper?