2009-02-03 38 views
11

Tôi đang sử dụng sqlite với python 2.5. Tôi gặp lỗi sqlite với cú pháp bên dưới. Tôi nhìn quanh và thấy AUTOINCREMENT trên trang này http://www.sqlite.org/syntaxdiagrams.html#column-constraint nhưng điều đó cũng không hoạt động. Nếu không có AUTO_INCREMENT, bảng của tôi có thể được tạo.AUTO_INCREMENT trong vấn đề sqlite với python

An error occurred: near "AUTO_INCREMENT": syntax error 
CREATE TABLE fileInfo 
(
fileId int NOT NULL AUTO_INCREMENT, 
name varchar(255), 
status int NOT NULL, 
PRIMARY KEY (fileId) 
); 

Trả lời

38

Điều này được giải quyết trong SQLite FAQ. Question #1.

nào khẳng định:

Làm thế nào để tạo ra một autoincrement lĩnh vực?

Câu trả lời ngắn: Cột được khai báo KEY CHÍNH TÍCH TỪ INTEGER sẽ tự động .

Dưới đây là câu trả lời dài: Nếu bạn tuyên bố một cột của một bảng được INTEGER PRIMARY KEY, sau đó bất cứ khi nào bạn chèn một NULL vào cột của bảng , NULL tự động là chuyển sang integer đó là một trong số lớn hơn giá trị lớn nhất của cột đó trên tất cả các hàng khác trong bảng hoặc 1 nếu bảng trống. (. Nếu phím số nguyên lớn nhất có thể, 9223372036854775807, sau đó là một không sử dụng giá trị quan trọng được chọn ngẫu nhiên) Đối với dụ, giả sử bạn có một bảng như này:

CREATE TABLE t1( a INTEGER PRIMARY KEY, b INTEGER); Với bảng này, sự tuyên bố

INSERT INTO t1 VALUES(NULL,123); là logic tương đương với nói:

INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123); có một chức năng có tên sqlite3_last_insert_rowid() sẽ trả về phím số nguyên cho thao tác chèn gần đây nhất.

Lưu ý rằng phím số nguyên là một lớn hơn khóa lớn nhất là trong bảng ngay trước khi chèn. Khoá mới sẽ là duy nhất trên tất cả các phím hiện có trong bảng, nhưng có thể trùng lặp với các khóa đã được trước đó bị xóa khỏi bảng. Để tạo các khóa duy nhất trong khoảng thời gian tuổi thọ của bảng, hãy thêm từ khóa AUTOINCREMENT vào báo cáo INTEGER PRIMARY KEY. Sau đó, khóa được chọn sẽ lớn hơn khóa lớn nhất đã từng tồn tại trong bảng đó. Nếu khóa lớn nhất có thể trước đây đã tồn tại trong bảng đó, thì INSERT sẽ không thành công với mã lỗi mã SQLITE_FULL.

+3

Tôi thích kiểu này câu trả lời. Bạn nên nén nó vào RTFM :) – lmsasu

5

Bạn có thể thử

CREATE TABLE fileInfo 
(
fileid INTEGER PRIMARY KEY AUTOINCREMENT, 
name STRING, 
status INTEGER NOT NULL 
);
Các vấn đề liên quan