executeUpdate() 抛出 MySQLSyntaxErrorException

Posted

技术标签:

【中文标题】executeUpdate() 抛出 MySQLSyntaxErrorException【英文标题】:executeUpdate() throwing a MySQLSyntaxErrorException 【发布时间】:2015-06-23 03:09:20 【问题描述】:

我的目标是在我创建的现有表中添加一个新行。但是,我收到以下错误。

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'Name, Last Name, Tel No.)VALUES (2056732, 'Hello', 'World', 3)' 附近使用正确的语法 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:408) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在 com.mysql.jdbc.Util.getInstance(Util.java:386) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006) 在 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468) 在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629) 在 com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719) 在 com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2450) 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2371) 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2355) 在AddingNewRow.main(AddingNewRow.java:50)

这是代码的一部分。如果您需要整个代码以找出问题所在,请告诉我。

Connection conn = null;
    PreparedStatement ps = null;

    Scanner in = new Scanner(System.in);

    System.out.print("Enter the student number: ");
    int studentNO = in.nextInt();
    System.out.print("Enter the first name: ");
    String fName = in.next();
    System.out.print("Enter the last name: ");
    String lName = in.next();
    System.out.print("Enter the telephone number: ");
    int telNO = in.nextInt();

    try 
        conn = DriverManager.getConnection(CONN_STRING, USERNAME, PASSWORD);
        System.out.println("Connected");

        //Executing a query
        String sql_query = "INSERT INTO registration (ID, First Name, Last Name, Tel No.) VALUES (?, ?, ?, ?)";
        System.out.println("Table found");

        ps = conn.prepareStatement(sql_query);
        ps.setInt(1, studentNO); 
        ps.setString(2, fName);
        ps.setString(3, lName);
        ps.setInt(4, telNO);
        System.out.println("Values added");

        ps.executeUpdate();
        System.out.println("Values updated");

    

这是我运行程序时得到的输出

输入学号:1234567

输入名字:你好

输入姓氏:世界

输入电话号码:123321

已连接

找到表

增加的价值

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException...

我知道这可能只是一个非常愚蠢的问题,但我刚刚开始使用数据库,即使在阅读了此处发布的大多数其他类似问题之后,我也无法弄清楚代码有什么问题。

如果有人能告诉我哪里出了问题,我将非常感激。提前致谢。

【问题讨论】:

我会担心列名中有空格...... 您确定该列有句号吗? Tel No. 【参考方案1】:

试试这个

INSERT INTO registration (`ID`, `First Name`, `Last Name`, `Tel No.`) VALUES (?, ?, ?, ?)

带有backticks的列名。

【讨论】:

正如 singhakash 所说,使用反引号允许在 SQL 查询中使用空格等字符。 非常感谢!那确实奏效了!你能解释一下之前出了什么问题以及为什么你的方法有效吗?我仍然是编程新手,任何帮助将不胜感激。【参考方案2】:

可能是您使用setString设置学生证号造成的。这将告诉准备好的语句它应该是一个字符串,而不是一个整数。此外,您可能需要在 Tel No. 字段周围添加回勾。

【讨论】:

对不起,我正在用代码测试不同的东西,只是为了找出错误所在。它最初设置为 setInt,但也不起作用。我修复了那个特定的错误。感谢您指出。【参考方案3】:

换行试试

String sql_query = "INSERT INTO registration (ID, First Name, Last Name, Tel No.) VALUES (?, ?, ?, ?)";

String sql_query = "INSERT INTO registration (`ID`, `First Name`, `Last Name`, `Tel No.`) VALUES (?, ?, ?, ?)";

另外,如果我是你,我会尽量避免表和字段名称中的特殊字符和空格,因为这些是你的问题的原因。

【讨论】:

非常感谢您帮助我。我真的很感谢你的小费。下次使用数据库时,我会牢记这一点。

以上是关于executeUpdate() 抛出 MySQLSyntaxErrorException的主要内容,如果未能解决你的问题,请参考以下文章

PrepareStatement 挂在 executeUpdate 函数上

sql 异常 不能为带有 SELECT 查询的 SELECT 发出 executeUpdate

mysqls

mysqls数据库的常用管理命令

executeexecuteQuery和executeUpdate之间的区别

JDBC中 execute 与 executeUpdate的区别