Tóm tắt :trong hướng dẫn này, bạn sẽ tìm hiểu về SQLite AUTOINCREMENT
thuộc tính cột và thời điểm sử dụng nó trong bảng của bạn.
Giới thiệu về SQLite ROWID
bảng
Bất cứ khi nào bạn tạo bảng mà không chỉ định WITHOUT ROWID
tùy chọn, bạn nhận được một cột tăng dần tự động ngầm được gọi là rowid
. rowid
cột lưu trữ số nguyên có dấu 64 bit xác định duy nhất một hàng trong bảng.
Hãy xem ví dụ sau.
Đầu tiên, tạo một bảng mới có tên people
có hai cột:first_name,
và last_name
:
CREATE TABLE people (
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Thứ hai, chèn một hàng vào people
bảng sử dụng INSERT
sau tuyên bố:
INSERT INTO people (first_name, last_name)
VALUES('John', 'Doe');
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Thứ ba, truy vấn dữ liệu từ people
sử dụng SELECT
sau tuyên bố:
SELECT
rowid,
first_name,
last_name
FROM
people;
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Như bạn có thể thấy rõ từ đầu ra, SQLite tạo ngầm một cột có tên rowid
và tự động chỉ định một giá trị số nguyên bất cứ khi nào bạn chèn một hàng mới vào bảng.
Lưu ý rằng bạn cũng có thể tham khảo rowid
sử dụng bí danh của nó:_rowid_
và oid
.
Khi bạn tạo một bảng có INTEGER PRIMARY KEY
, cột này là bí danh của rowid
cột.
Câu lệnh sau đây bỏ bảng people
và tạo lại nó. Tuy nhiên, lần này, chúng tôi thêm một cột khác có tên person_id
có kiểu dữ liệu là INTEGER
và ràng buộc cột là PRIMARY KEY
:
DROP TABLE people;
CREATE TABLE people (
person_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Trong trường hợp này, person_id
thực tế là cột rowid
cột.
Làm cách nào để SQLite gán một giá trị số nguyên cho rowid
cột?
Nếu bạn không chỉ định rowid
hoặc bạn sử dụng NULL
giá trị khi bạn chèn một hàng mới, SQLite sẽ tự động gán số nguyên tuần tự tiếp theo, số này lớn hơn một số nguyên lớn nhất so với rowid
lớn nhất trong bàn. rowid
giá trị bắt đầu từ 1.
Giá trị lớn nhất của rowid
cột là 9,223,372,036,854,775,807
, rất lớn. Nếu dữ liệu của bạn đạt đến giá trị lớn nhất này và bạn cố gắng chèn một hàng mới, SQLite sẽ tìm một số nguyên không sử dụng và sử dụng nó. Nếu SQLite không thể tìm thấy bất kỳ số nguyên không sử dụng nào, nó sẽ đưa ra SQLITE_FULL
lỗi. Trên hết, nếu bạn xóa một số hàng và chèn một hàng mới, SQLite sẽ cố gắng sử dụng lại rowid
giá trị từ các hàng đã xóa.
Hãy làm một bài kiểm tra về nó.
Đầu tiên, hãy chèn một hàng có giá trị lớn nhất vào people
bảng.
INSERT INTO people (person_id,first_name,last_name)
VALUES( 9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Thứ hai, chèn một hàng khác mà không chỉ định giá trị cho person_id
cột:
INSERT INTO people (first_name,last_name)
VALUES('William','Gate');
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Như được hiển thị rõ ràng trong đầu ra, hàng mới nhận được một số nguyên chưa sử dụng.
Hãy xem xét một ví dụ khác.
Đầu tiên, tạo một bảng mới có tên t1
có một cột:
CREATE TABLE t1(c text);
Code language: SQL (Structured Query Language) (sql)
Thứ hai, chèn một số hàng vào t1
bảng:
INSERT INTO t1(c) VALUES('A');
INSERT INTO t1(c) values('B');
INSERT INTO t1(c) values('C');
INSERT INTO t1(c) values('D');
Code language: SQL (Structured Query Language) (sql)
Thứ ba, truy vấn dữ liệu từ t1
bảng:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
Thứ tư, xóa tất cả các hàng của t1
bảng:
DELETE FROM t1;
Code language: SQL (Structured Query Language) (sql)
Thứ năm, chèn một số hàng vào t1
bảng:
INSERT INTO t1(c) values('E');
INSERT INTO t1(c) values('F');
INSERT INTO t1(c) values('G');
Code language: SQL (Structured Query Language) (sql)
Cuối cùng, truy vấn dữ liệu từ t1
bảng:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
Như bạn có thể thấy, rowid 1, 2 và 3 đã được sử dụng lại cho các hàng mới.
SQLite AUTOINCREMENT
thuộc tính cột
SQLite khuyến cáo rằng bạn không nên sử dụng AUTOINCREMENT
thuộc tính vì:
AUTOINCREMENT
từ khóa áp đặt thêm CPU, bộ nhớ, dung lượng ổ đĩa và I / O ổ đĩa và nên tránh nếu không thực sự cần thiết. Nó thường không cần thiết.
Ngoài ra, cách SQLite chỉ định giá trị cho AUTOINCREMENT
hơi khác so với cách nó làm cho rowid
cột.
Hãy xem xét ví dụ sau.
Đầu tiên, thả và tạo lại people
bàn. Lần này, chúng tôi sử dụng AUTOINCREMENT
cột thuộc tính:
DROP TABLE people;
CREATE TABLE people (
person_id INTEGER PRIMARY KEY AUTOINCREMENT,
first_name text NOT NULL,
last_name text NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Thứ hai, chèn một hàng có rowid
tối đa giá trị của people
bảng.
INSERT INTO people (person_id,first_name,last_name)
VALUES(9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Thứ ba, chèn một hàng khác vào people
bảng.
INSERT INTO people (first_name,last_name)
VALUES('John','Smith');
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Lần này, SQLite đưa ra thông báo lỗi vì person_id
cột không sử dụng lại số như rowid
cột.
[Err] 13 - database or disk is full
Code language: SQL (Structured Query Language) (sql)
Khi nào bạn nên sử dụng AUTOINCREMENT
thuộc tính cột?
Mục đích chính của việc sử dụng thuộc tính AUTOINCREMENT
là ngăn SQLite sử dụng lại giá trị chưa được sử dụng hoặc giá trị từ hàng đã xóa trước đó.
Nếu bạn không có bất kỳ yêu cầu nào như vậy, bạn không nên sử dụng AUTOINCREMENT
thuộc tính trong khóa chính.
Trong hướng dẫn này, bạn đã học cách SQLite AUTOINCREMENT
thuộc tính hoạt động và cách nó ảnh hưởng đến cách SQLite chỉ định giá trị cho cột khóa chính.