【问题标题】:Java - You have an error in your SQL syntax;Java - 您的 SQL 语法有错误;
【发布时间】:2017-10-27 03:40:21
【问题描述】:

我只想在我的 sql 数据库中的表中进行简单的插入。尽管如此,即使我以多种方式尝试过,我也会收到此错误。我在我的数据库“test”中有一个名为“values”的表,其中包含一个简单的 id 列“idValues”和一个名为“value”的 int 值列。我只想插入一个简单的记录,其中 1 表示 ID,1 表示值(1/1)。某些版本可能有问题吗?

package jdbcdemo;

import java.sql.*;

public class Driver {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    try {

        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Connection myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false", "root", "rmi1337");

        Statement statement = myConn.createStatement();

        String sql = "INSERT INTO values " + "(idValues, value)" + "VALUES (1, 1)";
        statement.executeUpdate(sql);


    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }




}


com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'values(idValues, value)VALUES (1, 1)' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486)
at com.mysql.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1552)
at com.mysql.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2607)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1480)
at jdbcdemo.Driver.main(Driver.java:22)

【问题讨论】:

  • 我猜values 作为表名不是一个好的选择
  • 如您所见,values 是 SQL 中的关键字。如果您要将表称为“值”(我建议您不要),则必须对其进行转义;例如`values`
  • 谢谢,早该想到的!好吧,他们也可以在创建表格时告诉我这一点
  • 您也根本不需要为您的 sql 变量进行字符串连接。如果您删除连接并将其变成一个大字符串,至少看起来会更干净。

标签: java sql syntax workbench


【解决方案1】:

Valuesvalue 都是保留字,因此需要转义

String sql = "INSERT INTO `values` " + "(idValues, `value`)" + " VALUES (1, 1)";

【讨论】:

    【解决方案2】:

    它错过了一个空白。

    'values(idValues, value)VALUES (1, 1)' 
    

    应该是:

    'values(idValues, value) VALUES (1, 1)' 
    

    所以你应该写它:

    String sql = "INSERT INTO values " + "(idValues, value) " + " VALUES (1, 1)";
    

    但无论如何,您不应在元数据中使用关键字或保留字。
    “值”表具有误导性,此外它可能会根据所使用的 DBMS 以及所使用的操作系统来工作。

    link 介绍 MySQL 如何处理区分大小写时,您可以阅读:

    这意味着此类名称在 Windows 中不区分大小写,但区分大小写 在大多数 Unix 版本中都很敏感。

    other link 中,您可以获取有关 MySQL 保留键的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 2016-10-30
      • 2014-04-21
      • 2014-06-08
      • 2016-01-24
      相关资源
      最近更新 更多