SQLite có một hàm được gọi là last_insert_rowid()
trả về ROWID của chèn hàng cuối cùng từ kết nối cơ sở dữ liệu đã gọi hàm.
Ví dụ
Dưới đây là một ví dụ để minh họa cách last_insert_rowid()
hàm hoạt động trong SQLite.
Trước tiên, hãy tạo một bảng và chèn một số dữ liệu:
CREATE TABLE Cats(
CatId INTEGER PRIMARY KEY,
CatName
);
INSERT INTO Cats VALUES
( NULL, 'Brush' ),
( NULL, 'Scarcat' ),
( NULL, 'Flutter' );
Điều này sẽ tự động tạo ROWID cho mỗi hàng. Do đó, câu lệnh SQL này sẽ tạo ra ba ROWID khác nhau; 1, 2 và 3.
Bây giờ chúng ta có thể sử dụng last_insert_rowid()
hàm để trả về giá trị của ROWID cuối cùng.
SELECT last_insert_rowid();
Kết quả:
3
Theo dự kiến, ROWID cuối cùng là 3.
Chèn vào một bảng khác
Lưu ý rằng last_insert_rowid()
hoạt động dựa trên kết nối cơ sở dữ liệu, không phải ở cấp bảng.
Do đó, nếu tôi tạo một bảng mới, sau đó chèn các hàng vào bảng đó, last_insert_rowid()
giá trị sẽ dựa trên that thao tác chèn.
CREATE TABLE Dogs(
DogId INTEGER PRIMARY KEY,
DogName
);
INSERT INTO Dogs VALUES
( NULL, 'Yelp' ),
( NULL, 'Woofer' );
SELECT last_insert_rowid();
Kết quả:
2
Lưu ý thêm, khi tôi tạo các bảng, tôi đã xác định các cột đầu tiên là cột tự động tăng. Điều này được định nghĩa ngầm khi tôi sử dụng INTEGER PRIMARY KEY
.
Do đó, khi tôi chọn tất cả các hàng, tôi có thể thấy rằng hàng cuối cùng chứa last_insert_rowid()
giá trị trong cột đó.
SELECT * FROM Dogs;
Kết quả:
DogId DogName ---------- ---------- 1 Yelp 2 Woofer
Trong SQLite, một cột có loại INTEGER PRIMARY KEY là bí danh cho ROWID.
Truy vấn sau đây chứng minh điều này.
SELECT
rowid,
*
FROM Dogs;
Kết quả:
DogId DogId DogName ---------- ---------- ---------- 1 1 Yelp 2 2 Woofer
Lưu ý rằng có thể tạo một cột mà không cần sử dụng tính năng tự động tăng mã SQLite có sẵn. Nếu bạn làm điều này, thì cột "ID" của bạn có thể có giá trị khác với giá trị ROWID.
Cũng có thể ghi đè giá trị tự động tăng thêm bằng giá trị rõ ràng của riêng bạn. Tuy nhiên, trong trường hợp này, giá trị ROWID sẽ vẫn phản ánh giá trị rõ ràng này.
INSERT INTO Dogs
VALUES ( 789, 'Fluff' );
SELECT
rowid,
*
FROM Dogs;
SELECT last_insert_rowid();
Kết quả:
DogId DogId DogName ---------- ---------- ---------- 1 1 Yelp 2 2 Woofer 789 789 Fluff
Và tất nhiên, last_insert_rowid()
cũng sẽ phản ánh giá trị ROWID mới nhất này.
SELECT last_insert_rowid();
Kết quả:
789
ROWID là gì?
ROWID là một khóa số nguyên có dấu 64 bit xác định duy nhất hàng trong bảng của nó. Tất cả các bảng trong SQLite đều có ROWID trừ khi bảng được xác định bằng WITHOUT ROWID
.
Giá trị ROWID có thể được truy cập bằng một trong các tên không phụ thuộc vào chữ hoa chữ thường rowid
, oid
hoặc _rowid_
thay cho tên cột. Nếu bảng chứa cột do người dùng xác định bằng một trong những tên đó, thì tên đó luôn tham chiếu đến cột được khai báo rõ ràng và không thể được sử dụng để truy xuất giá trị ROWID số nguyên.
Khi bạn xác định bảng có cột tự động tăng, cột đó sẽ tự động sử dụng giá trị ROWID cho hàng của nó.
Xem Cách AUTOINCREMENT hoạt động trong SQLite để biết thêm thông tin.