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

SQLite AUTOINCREMENT

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, 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_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 fullCode 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 5 cách để kiểm tra kiểu dữ liệu của cột trong SQLite

  2. gần lỗi synatx (mã 1) chèn Android SQLite

  3. Toán tử SQLite EXCEPT

  4. Cách tạo ứng dụng quốc tế hóa ngoại tuyến:Xây dựng cấu trúc dự án

  5. Cập nhật ListView dựa trên ContentProvider được SQLite hỗ trợ