2012-07-15 22 views
20

içinde Tamsayı Birincil anahtar için otomatik çözüm yok sqlite3 faq'da, boş değerle beslenen bir tamsayı birincil anahtarının otomatik olarak anlaşılacağı belirtilir. Ama bu benim için değil. Ad niteliği ince iken sqlite3

import sqlite3 as lite 
con = lite.connect('some.db') 
cur=con.cursor() 
data = "someone's name" 
cur.execute("INSERT INTO dummy VALUES(NULL, ?)", data) 
con.commit() 

ilk özellik serial_num

boş gösteriliyor, sqlite3 içinde, CREATE TABLE dummy(serial_num INTEGER PRIMARY KEY, name TEXT); bir tablo çoğaltmak ve python kullanarak doldurmak için. Ben SELECT serial_num FROM dummy yaptığımda sadece bir sürü boş alan elde ediyorum. Neyi yanlış yapıyorum?

+0

Eklemem gerekir ki, şema tanımlamak için denedim ... 'serial_num INTEGER PRIMARY KEY NOT NULL ...' ve 'sqlite3.IntegrityError hatası: dummy.serial_no olmayabilir NULL' – yayu

cevap

25

Bu, SQLite'nin quirklerinden biridir. Gönderen fine manual:

According to the SQL standard, PRIMARY KEY should always imply NOT NULL. Unfortunately, due to a long-standing coding oversight, this is not the case in SQLite. Unless the column is an INTEGER PRIMARY KEY SQLite allows NULL values in a PRIMARY KEY column. We could change SQLite to conform to the standard (and we might do so in the future), but by the time the oversight was discovered, SQLite was in such wide use that we feared breaking legacy code if we fixed the problem.

INTEGER PRIMARY KEY üzerine lazer tarama otomatik artışlarla ama gerçekte sütun NOT NULL olması zorunluluğu olduğuna bu özel INTEGER PRIMARY KEY olmak için bir sütun için nelerin gerekli olduğunu konusunda biraz belirsizdir Şunu NULL değerini kullanmak istiyorsanız ekleme "bana bir sonraki otomatik artan değer vermek": Eğer not null dışarı bırakırsanız

create table dummy (
    serial_num integer primary key not null, 
    name text 
); 

, bu gibi ekler yapmak gerekir:

serial_num için otomatik artış değerini almak için. Aksi takdirde, SQLite bir NULL anlamı "bana bir sonraki otomatik arttırma değerini ver" ve "NULL anlamına gelir" NULL anlam "serial_num içinde bir NULL değeri koymak arasındaki farkı" söyleme yolu yoktur.

+1

Çok teşekkürler. Deneme yaparken, aynı zamanda, autoincrement'in sadece birincil anahtar olarak bir sütunla çalıştığını öğrendim. – yayu

+0

@yayu: [Belgeler] 'in (http://www.sqlite.org/lang_createtable.html#primkeyconst) bu bölümü en azından oldukça açıktır: "Bir tablonun tek bir sütun birincil anahtarı varsa ve bildirilen türü bu sütun "INTEGER" ... " –

2

Yukarıda sağlanan ekleme sözdizimi not null'un yokluğunda çalışacak gibi görünmüyor.

İşte bir örnek - yukarıda belirttiğiniz ekleme biçimini kullanmamama rağmen kimlik alanının otomatik olarak doldurulmadığına dikkat edin.

sqlite> .schema logTable 
CREATE TABLE logTable (ID INTEGER PRIMARY_KEY, ts REAL, level TEXT, message TEXT); 
sqlite> INSERT into LOGTABLE (ts, level, message) VALUES (111, "autoinc test", "autoinc test"); 
sqlite> select * from logtable where ts = 111; 
|111.0|autoinc test|autoinc test 
sqlite> 

NOT NULL geçici çözümüyle çalışır.

sqlite> create TABLE logTable (ID INTEGER PRIMARY KEY NOT NULL, ts REAL, level TEXT, message TEXT); 
sqlite> INSERT into LOGTABLE (ts, level, message) VALUES (222, "autoinc test", "autoinc test"); 
sqlite> select * from logtable where ts = 222; 
1|222.0|autoinc test|autoinc test 

yerine önceki cevabı yorumlamaya yeni bir cevap olarak bu yazabilmek için özür dileriz, ancak ünüm skor yorum eklemek çok düşük olduğunu ve bunun alternatif ekleme deyimi olduğuna dikkat etmek önemli olduğunu düşündük yeterli bir çözüm değil.