我在SQLite数据库中有一个表,其ID字段为integer primary key
(因此autoincrement
编辑)。我有以下查询在表中插入记录。
INSERT INTO users(fname, lname, email, password) VALUES('Foo','Bar','foo@bar.com','12345');
省略第一个字段u_id
。此查询从终端运行良好,我可以插入记录,但是从Java中执行此操作会抛出SQLException
消息users.u_id may not be NULL
。我正在使用PreparedStatement
以下查询:
INSERT INTO users(fname, lname, email, password) VALUES(?,?,?,?)
我在这里做错了什么?
注意:
我正在使用带有JDBC驱动程序SQLiteJDBC的SQLite 3(该站点已关闭但我之前已经下载了jar
文件)。这与司机有关吗?
这是抛出异常的堆栈跟踪:
java.sql.SQLException: users.u_id may not be NULL
at org.sqlite.DB.execute(DB.java:275)
at org.sqlite.DB.executeUpdate(DB.java:281)
at org.sqlite.PrepStmt.executeUpdate(PrepStmt.java:77)
at com.paperfood.DatabaseManager.insertUser(DatabaseManager.java:64)
at com.paperfood.controller.RegisterUser.doPost(RegisterUser.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
以下是我的记录插入Java代码:
PreparedStatement pst = con.prepareStatement("INSERT INTO users(fname, lname, email, password) VALUES(?,?,?,?)");
pst.setString(1, user.getFirstName());
pst.setString(2, user.getLastName());
pst.setString(3, user.getEmail());
pst.setString(4, user.getPassword());
pst.executeUpdate();
其中,user
是实体类的对象,其字段映射到表字段。另请注意,我的控制器(RegisterUser
servlet)正在使用DatabaseManager
类来插入记录,而DatabaseManager
类具有方法insertUser()
,它接受实体类'对象类的参数User
。
以下是创建表users
的SQL:
CREATE TABLE users(
u_id integer PRIMARY KEY,
fname varchar(30),
lname varchar(30),
email varchar(30),
password varchar(32)
);
答案 0 :(得分:0)
你可以试试这个。
PreparedStatement pst = con.prepareStatement("INSERT INTO users(u_id, fname, lname, email, password) VALUES(?,?,?,?,?)");
pst.setString(1, null);
pst.setString(2, user.getFirstName());
pst.setString(3, user.getLastName());
pst.setString(4, user.getEmail());
pst.setString(5, user.getPassword());
根据this,将其设置为null应该有效。
如果在插入上没有指定ROWID,或者指定的ROWID的值为NULL,则会自动创建适当的ROWID。
根据上述声明的第一部分,我不确定为什么你的代码不起作用,尽管它是正确的。
修改强>
刚遇到this。请检查您是否在代码中指向正确的数据库。
答案 1 :(得分:0)
您当前的主键不是自动增量,因此您需要自己指定主键的值。如果您希望主键是自动增量,则需要明确指定它。
请参阅:http://www.sqlite.org/autoinc.html您的表定义必须是:
CREATE TABLE users(
u_id integer PRIMARY KEY AUTOINCREMENT,
fname varchar(30),
lname varchar(30),
email varchar(30),
password varchar(32)
);