2011-10-26 49 views
72

Tôi đang cố gắng tạo một bảng có khóa chính tăng tự động trong Sqlite3. Tôi không chắc chắn nếu điều này là thực sự có thể, nhưng tôi hy vọng chỉ phải chỉ định các lĩnh vực khác. Ví dụ:Có tăng tự động trong sqlite không?

CREATE TABLE people (id integer primary key auto increment, first_name varchar(20), last_name varchar(20)); 

Sau đó, khi tôi thêm một giá trị, tôi đã hy vọng để chỉ phải làm:

INSERT INTO people 
VALUES ("John", "Smith"); 

Đây có phải là thậm chí có thể?

Tôi đang chạy sqlite3 dưới cygwin trong Windows 7.

Trả lời

113

Bạn nhận được một miễn phí, được gọi là ROWID. Đây là trong mỗi bảng SQLite cho dù bạn yêu cầu nó hay không.

Nếu bạn bao gồm cột loại INTEGER PRIMARY KEY, cột đó trỏ vào (là bí danh cho) cột ROWID tự động.

ROWID (bởi bất kỳ tên nào bạn gọi nó) được gán giá trị bất cứ khi nào bạn INSERT một hàng, như bạn mong đợi. Nếu bạn chỉ định rõ ràng giá trị không NULL trên INSERT, nó sẽ nhận được giá trị được chỉ định đó thay vì tự động tăng. Nếu bạn chỉ định rõ ràng một giá trị NULL trên INSERT, nó sẽ nhận được giá trị gia tăng tự động tiếp theo.

Ngoài ra, bạn nên cố gắng tránh:

INSERT INTO people VALUES ("John", "Smith"); 

và sử dụng

INSERT INTO people (first_name, last_name) VALUES ("John", "Smith"); 

để thay thế. Phiên bản đầu tiên rất mong manh - nếu bạn thêm, di chuyển hoặc xóa các cột trong định nghĩa bảng, INSERT sẽ không thành công hoặc tạo ra dữ liệu không chính xác (với các giá trị sai cột).

+28

ROWID không hoàn toàn giống với tự động thực sự vì giá trị SAME có thể được tạo nhiều lần. Ví dụ, với một bảng trống, chèn 3 hàng cho hàng thứ ba ROWID là 3 như mong đợi. Tuy nhiên chèn 2 hàng, xóa hàng cuối cùng và chèn một hàng khác, cung cấp hàng thứ 3 được chèn vào ROWID là 2, giống như hàng thứ 2 có. Do đó, có một vấn đề nghiêm trọng rõ ràng nếu các bảng tham chiếu ROWID trong một bảng nơi các lần xóa xảy ra và việc xóa hoặc hủy ROWID cũng không được thực hiện trong các bảng có liên quan. – Nick

+2

Trong trường hợp không rõ ràng từ câu trả lời, bạn có thể sử dụng ROWID trong câu lệnh chọn của bạn, ví dụ: 'chọn rowid từ người;' –

8

Bạn đã đọc? How do I create an AUTOINCREMENT field.

INSERT INTO people 
VALUES (NULL, "John", "Smith"); 
+0

Vì vậy, những gì bạn đang nói là những gì tôi đang cố gắng làm là không thể, nhưng tôi có thể mô phỏng. Tôi cần phải sử dụng một null trong chèn? – ewok

+1

bạn không cần phải làm bất cứ điều gì nhưng luôn luôn được chèn NULL như id, nó chỉ giải thích làm thế nào sqlite hiện nó nội bộ. –

+5

NULL trên INSERT là * chỉ * bắt buộc nếu bạn không chỉ định danh sách các cột cho INSERT (trong trường hợp này, bạn cần một số giá trị khớp chính xác với số cột và phải sử dụng NULL làm trình giữ chỗ). Nhưng làm một INSERT mà không chỉ định danh sách các cột là không bao giờ thực hành tốt. Nếu bạn chỉ định danh sách các cột, chỉ cần bỏ qua cả cột autoincrement và giá trị NULL, và bạn sẽ nhận được kết quả mong đợi. –

24

Có, điều này là có thể. Theo tài liệu SQLite, 'Một cột được khai báo INTEGER PRIMARY KEY sẽ tự động tăng lên.' (http://www.sqlite.org/autoinc.html)

+6

Thông báo trước, như đã đề cập bởi Uku, và cũng được giải thích trong tài liệu, là bạn cần phải chuyển vào một NULL cho ID để làm việc này. –

+11

Bạn chỉ * cần * để sử dụng NULL nếu bạn bỏ qua danh sách các cột để INSERT - không bao giờ là một thực hành tốt. Nếu bạn chỉ định các cột, bạn có thể chỉ cần bỏ qua cột tăng tự động và cột sẽ nhận giá trị tiếp theo. –

2

Bên cạnh hàng, bạn có thể xác định trường tăng tự động của riêng mình nhưng không được khuyến nghị. Nó luôn luôn là giải pháp tốt hơn khi chúng tôi sử dụng rowid được tự động tăng lên.

Từ khóa AUTOINCREMENT áp đặt thêm CPU, bộ nhớ, dung lượng đĩa, và đĩa I/O trên cao và nên tránh nếu không cần thiết nghiêm ngặt. Đó là thường không cần thiết.

Đọc here để biết thông tin chi tiết.

+0

dường như rowid không phải lúc nào cũng tự động được tăng lên, xem nhận xét của Nick – rogerdpack

+0

Không đúng sự thật. Tăng tự động tốt hơn ở một số khía cạnh, vì nó sẽ không sử dụng lại ID - một yêu cầu khá quan trọng đối với nhiều hệ thống. –

2

SQLITE AUTOINCREMENT là từ khóa được sử dụng để tự động tăng giá trị của một trường trong bảng. Chúng tôi có thể tự động tăng giá trị trường bằng cách sử dụng từ khóa AUTOINCREMENT khi tạo bảng có tên cột cụ thể để tự động tăng giá trị đó.

Từ khóa AUTOINCREMENT chỉ có thể được sử dụng với trường INTEGER. Cú pháp:

Việc sử dụng cơ bản của từ khóa autoincrement được như sau:

CREATE TABLE tên_bảng ( column1 INTEGER autoincrement, column2 datatype, cột3 datatype, ..... columnn datatype, ) ;

Ví dụ Xem Dưới đây: Xem xét bảng CÔNG TY được tạo ra như sau:

sqlite> CREATE TABLE TB_COMPANY_INFO ( ID INTEGER PRIMARY KEY autoincrement, TÊN TEXT NOT NULL, TUỔI INT NOT NULL, ĐỊA CHỈ CHAR (50), SALARY REAL );

Bây giờ, chèn bản ghi vào bảng TB_COMPANY_INFO sau:

INSERT INTO TB_COMPANY_INFO (tên, tuổi, ĐỊA CHỈ, LƯƠNG) VALUES ('Manoj KUMAR', 40, 'Meerut, UP, ẤN ĐỘ', 200000.00);

Bây giờ Chọn kỷ lục SELECT * FROM TB_COMPANY_INFO ID TÊN TUỔI ĐỊA CHỈ TIỀN LƯƠNG 1 Manoj Kumar 40 Meerut, UP, ẤN ĐỘ 200000.00

2

Người ta không nên chỉ định AUTOINCREMENT từ khóa gần PRIMARY KEY. Ví dụ về tạo khóa chính autoincrement và chèn:

$ sqlite3 ex1 

CREATE TABLE IF NOT EXISTS room(room_id INTEGER PRIMARY KEY, name VARCHAR(25) NOT NULL, home_id VARCHAR(25) NOT NULL); 

INSERT INTO room(name, home_id) VALUES ('test', 'home id test'); 

INSERT INTO room(name, home_id) VALUES ('test 2', 'home id test 2'); 

SELECT * FROM room; 

sẽ cung cấp cho:

1|test|home id test 
2|test 2|home id test 2 
0

Tôi biết câu trả lời này là hơi muộn.
Mục đích của tôi cho câu trả lời này là để tham khảo của mọi người nếu họ gặp phải loại thách thức này với SQLite ngay bây giờ hoặc trong tương lai và họ đang gặp khó khăn với nó.

Bây giờ, nhìn lại truy vấn của bạn, nó sẽ giống như thế này.

CREATE TABLE people (id integer primary key autoincrement, first_name varchar(20), last_name varchar(20)); 

Nó hoạt động trên đầu của tôi. Giống như vậy,

enter image description here

Chỉ trong trường hợp bạn đang làm việc với SQLite, tôi đề nghị để bạn có thể kiểm tra DB Browser for SQLite. Hoạt động trên các nền tảng khác nhau.

Các vấn đề liên quan