2012-07-15 3 views
20

sqlite3 faq에서 정수 값 기본 키가 null 값을 제공 받으면 자동 증가됩니다. 그러나 이것은 나를 위해 일어나지 않습니다. 이름 속성은 미세 동안 정수에 대한 자동 증가 없음 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() 

제 속성 serial_num

빈 도시되고, sqlite3를에서는 CREATE TABLE dummy(serial_num INTEGER PRIMARY KEY, name TEXT);를 테이블을 복제 및 Python를 사용하여 작성한다. 내가 할 때 SELECT serial_num FROM dummy 나는 방금 빈 공간을 얻을. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

스키마를 '... serial_num INTEGER PRIMARY KEY NOT NULL ...'으로 정의하고 'sqlite3.IntegrityError : dummy.serial_no가 NULL이 아닐 수도 있습니다.'라는 오류 메시지가 표시되면 다시 입력해야합니다. – yayu

답변

25

이것은 SQLite의 단점 중 하나입니다. 부터 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의 문서는 정확하게 자동 증가하지만 현실은 열이 NULL NOT 할 필요가 있다는 것을이 특별한 INTEGER 기본 키가 될 수있는 열을 위해 필요한 사항에 대해 조금 불분명하다 당신이 의미하는 NULL 값을 사용하려면 삽입 "나에게 다음 자동 증가 값주고"당신이 not null을두면

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

을, 당신은이처럼 삽입을 수행해야합니다

serial_num에 대한 자동 증가 값을 얻으십시오. 그렇지 않으면 SQLite는 "다음 자동 증가 값을 지정하십시오"라는 의미와 "NULL을 허용하기 때문에 NULL 값을 serial_num에 넣습니다"라는 의미의 차이를 알 수있는 방법이 없습니다.

+1

고마워요. 실험하는 동안 필자는 자동 증가가 하나의 열만 기본 키로 작동한다는 것을 배웠습니다. – yayu

+0

@yayu : [documentation] (http://www.sqlite.org/lang_createtable.html#primkeyconst) 부분은 최소한 분명합니다. "테이블에 단일 열 기본 키가 있고 선언 된 유형이 그 열은'INTEGER' ... " –

2

위에 제공된 삽입 구문이 not null이없는 경우 작동하지 않는 것 같습니다.

다음은 예입니다. 위에서 지정한 삽입 형식을 사용하더라도 ID 필드가 자동 증가되지 않습니다.

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 해결 방법과 함께 작동합니다.

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 

내가 대신 이전의 대답에 주석의 새 응답으로이 게시 죄송하지만 내 평판 점수는 주석을 추가 할 너무 낮고, 나는 대체 삽입 문이 점에 유의하는 것이 중요하다고 생각 적절한 해결 방법이 아닙니다.

관련 문제