2010-06-14 81 views
0

我似乎誤解了該基本語法,爲什麼這個樣品的工作原理:SQLITE基本語法

sqlite3_prepare_v2(db, "insert into test values('boo','boo',0);", strlen(querystring)+1 , &stmt, NULL); 

if ((rc = sqlite3_step(stmt)) != SQLITE_DONE) 
    fprintf(stderr, "Error: sqlite3_step() %d. Error Message %s;\n",rc,sqlite3_errmsg(db)); 

但當我嘗試此查詢: 「插入測試(strtest)VALUES(‘噓’);」

我收到一個錯誤: 錯誤:sqlite3_step()19.錯誤消息約束失敗;

我錯過了什麼?

table test is:「create table test(blobtest BLOB(4)NOT NULL,strtest VARCHAR NOT NULL,inttest INTEGER NOT NULL);」

感謝, Doori酒吧

回答

4

所有三列被聲明爲NOT NULL,而他們沒有一個默認值。

所以您的查詢:

insert into test(strtest) values('boo'); 

只分配blobtest值,留出strtestinttest不能爲空。

您可以通過增加兩個數值解決這個問題,或者您可以更改表模式爲默認的東西,如:

create table test (
    blobtest BLOB(4) NOT NULL, 
    strtest VARCHAR NOT NULL DEFAULT '', 
    inttest INTEGER NOT NULL DEFAULT 0 
); 

(或者你可以拿出NOT NULL如果你想他們是NULL -able)

+0

非常感謝! (我想你實際上意味着strtest被設置爲'boo',但blobtest和inttest沒有NULL或缺省值,對嗎? – 2010-06-14 15:41:49

+0

@Doori Bar - Nope,'blobtest'是你的模式中聲明的第一列,所以除非你指定明確的列順序,例如:'insert into test(inttest,strtest,blobtest)values(...)' – Matt 2010-06-14 15:43:56

+0

但是我做了什麼? 「insert into test(strtest)values('boo');」 – 2010-06-14 15:50:21