2011-11-24 118 views
33

我產生一個SQLite表(JAVA):SQLite自動增量 - 如何插入值?

create table participants (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, col1,col2); 

之後,我嘗試使用INSERT COMAND添加行:

insert into participants values ("bla","blub"); 

我得到的錯誤:

java.sql.SQLException: table participants has 3 columns but 2 values were supplied 

我認爲行ID會自動生成,但似乎我錯過了任何東西。


我嘗試另一種解決方案:

PreparedStatement prep = conn.prepareStatement("insert into participants values (?,?,?);"); 
Integer n = null; 
prep.setInt(1,n); 
prep.setString(2, "bla"); 
prep.setString(3, "blub"); 
prep.addBatch(); 
prep.executeBatch(); 

作爲結果,我在收到一個空指針異常 「prep.setInt(1,N);」

您是否看錯了?

回答

48

您是否試過指出您傳遞的參數應該與哪些表格的字段相關?

INSERT INTO table_name (column1, column2, column3,...) 
VALUES (value1, value2, value3,...) 

在你的情況可能是這樣的:

INSERT INTO participants(col1, col2) VALUES ("bla","blub"); 
+0

我認爲這樣會起作用,我發現了另一種好方法並編輯了問題!謝謝 ! – Anthea

+1

這是正確的方法。這也不是特定於SQLite的。 –

+0

如果您正在進行模式遷移並使用select語句進行插入,您可以'插入參與者(col1,col2)從t1_backup中選擇col1,col2;' – mlissner

7

找到了有效的解決方案here

PreparedStatement prep = conn.prepareStatement("insert into participants values ($next_id,?,?);"); 
prep.setString(2, "bla"); 
prep.setString(3, "blub"); 
1

之所以你的錯誤是SQL插入希望你能提供相同數量的因爲在不使用列說明符時表中有列。

即當你寫一個SQL查詢是這樣的:

INSERT INTO TableName VALUES(a1,a2, ...) 

..數值必須在以相同的順序在表定義(以及同樣數額)。這是爲了避免含糊不清並減少錯誤的數量。

在你的情況下,你有一個自動增量列,你不想指定一個值。這當然是可能的,但遵循上述規則,你需要指定列名:

INSERT INTO TableName (columnName1, columnName2) VALUES(Value1, Value2); 
11
不使用的列名會 using nullautoincreament地方

最簡單的方法是這樣的

insert into table values (null, col1, col2) 

如果你已經將第一列設置爲自動增量,它會正常工作。