Đ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ề.