Java PreparedStatement无法执行MySQL Insert语句

Java PreparedStatement无法执行MySQL Insert语句,sql,jdbc,prepared-statement,Sql,Jdbc,Prepared Statement,我试图使用Java中的PreparedStatement将新用户插入数据库。我创建了一个格式正确的SQL语句,但由于某种原因,在调用executeUpdate()时创建了一个错误 我已经将打印出来的SQL语句复制并粘贴到终端中,在终端中打开了与数据库的连接,并且工作正常(添加了“;”) 我知道这不起作用,因为executeUpdate()之后的print语句从未被打印。我在代码的其他地方使用PreparedStatements来检查数据库中是否有用户,并且这些SELECT调用在executeQu

我试图使用Java中的PreparedStatement将新用户插入数据库。我创建了一个格式正确的SQL语句,但由于某种原因,在调用executeUpdate()时创建了一个错误

我已经将打印出来的SQL语句复制并粘贴到终端中,在终端中打开了与数据库的连接,并且工作正常(添加了“;”)

我知道这不起作用,因为executeUpdate()之后的print语句从未被打印。我在代码的其他地方使用PreparedStatements来检查数据库中是否有用户,并且这些SELECT调用在executeQuery()中工作正常

为什么会失败

编辑:我打印了堆栈跟踪,得到的错误是我的表的一个字段没有默认值。这是真的。表中有更多的字段是username/passwordHash/email,但是为什么请求可以从终端而不是从Java执行呢?(我想,如果我只指定默认值,就可以解决这个问题,但我想看看是否有其他方法。)

堆栈跟踪:

java.sql.SQLException: Field 'firstname' doesn't have a default value
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
at com.quizzine.database.UserData.createNewAccount(UserData.java:81)
at com.quizzine.login.CreateAccountServlet.doPost(CreateAccountServlet.java:50)
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:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
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:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
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:1002)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
我打印了堆栈跟踪,得到的错误是,我的表的一个字段没有默认值。这是真的。表中有更多的字段是username/passwordHash/email,但是为什么请求可以从终端而不是从Java执行呢

只要保留的列可以为空,或者它们具有通过
default
约束指定的默认值,就可以将值插入表中列的子集中。否则,无论通过控制台或
PreparedStatement
运行insert语句,它都注定会失败

java.sql.SQLException: Field 'firstname' doesn't have a default value
该异常意味着您的列
firstname
具有
notnull
约束,并且在创建表
table\u NAME

你可以通过这两种方法来解决这个问题

方法1:

alter "TABEL_NAME" 
add a default value, such as '' to the column "firstname"
或方法2:

    pstmt = con.prepareStatement("INSERT INTO " + TABLE_NAME + " (" + USERNAME + ", " + PASSWORD_HASH + ", " + EMAIL + ", " + FIRST_NAME + ") VALUES (?, ?, ?, '')");      // changed here
    pstmt.setString(1, username); // (these are parameters)
    pstmt.setString(2, passwordHash);
    pstmt.setString(3, email);

是的,我肯定我已经连接到数据库了。正常的SELECT查询也可以使用PreparedStatements返回正确的结果。
    pstmt = con.prepareStatement("INSERT INTO " + TABLE_NAME + " (" + USERNAME + ", " + PASSWORD_HASH + ", " + EMAIL + ", " + FIRST_NAME + ") VALUES (?, ?, ?, '')");      // changed here
    pstmt.setString(1, username); // (these are parameters)
    pstmt.setString(2, passwordHash);
    pstmt.setString(3, email);