2013-06-11 34 views
5

Tôi có một bảng sqlite (sqlite phiên bản 3.7.3), nơi null chèn vào cột khóa chính đang được undesirably tự động tăng lên:ngăn chặn autoincrementing số nguyên khóa chính?

sqlite> CREATE TABLE foo(bar INTEGER NOT NULL PRIMARY KEY); 
sqlite> INSERT INTO foo(bar) VALUES(NULL); 
sqlite> SELECT * FROM foo; 
1 

Trong sqlite docs, nó cho thấy rằng việc thêm các từ khóa AUTOINCREMENT đến cột nên tạo hành vi này, nhưng có vẻ không phải là một từ khóa để ngăn chặn tự động incrementing ...

tôi cũng thấy rằng tôi có thể xây dựng sqlite với SQLITE_OMIT_AUTOINCREMENTcompile option, nhưng tôi không muốn vô hiệu hóa hành vi trên toàn cầu, chỉ dành cho cột cụ thể này.

Điều thú vị là, nếu tôi không bao gồm PRIMARY KEY hạn chế, tôi nhận được hành vi mong muốn:

sqlite> CREATE TABLE FOO(bar integer NOT NULL); 
sqlite> INSERT INTO FOO(bar) VALUES(NULL); 
SQL error: foo.bar may not be NULL 

Làm thế nào tôi có thể định nghĩa bảng sao cho giá trị NULL bị từ chối giữ ràng buộc khoá chính?

Trả lời

6

Autoincrement hành vi chỉ áp dụng cho các cột được khai báo là INTEGER PRIMARY KEY. Vì vậy, cách dễ nhất để vô hiệu hóa nó là:

  • Khai báo cột là UNIQUE thay vì PRIMARY KEY.
  • Khai báo loại cột là INT thay vì INTEGER.

Lưu ý rằng một trong hai cột sẽ cung cấp cho bạn một cột có số nguyên ái lực thay vì bị hạn chế chỉ chứa số nguyên.

+0

wow, ngay trong tài liệu ...: D –

+1

Bạn cũng có thể muốn kết hợp UNIQUE với NOT NULL để ngăn không cho tạo các bản ghi "vô dụng" trong bảng của bạn. – Timo

-2

Một cách để vô hiệu hóa autoincrement (bên ngoài tái tạo bảng) khi bạn cần chèn dữ liệu là sử dụng công cụ nhập trong sqlite3:

Nếu bạn có một bảng như thế này:

CREATE TABLE [table1] ([ID] integer PRIMARY KEY AUTOINCREMENT NOT NULL, [col1] TEXT); 

Nếu bạn chạy lệnh nhập trên đó bằng tệp dữ liệu của mình:

ID col1 
10 abc 
20 def 

import myfile.txt table1 

Nó sẽ nhập hàng và sẽ bỏ qua tính năng tự động tăng.

+0

Không làm việc cho tôi ít nhất. Đã thử nghiệm với 'sqlite3 --version 3.8.10.2 2015-05-20 18:17:19 2ef4f3a5b1d1d0c4338f8243d40a2452cc1f7fe4' – Timo

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