【问题标题】:SQLException while creating a table in mysql在mysql中创建表时出现SQLException
【发布时间】:2016-09-10 06:10:21
【问题描述】:

在我的项目应用程序中,我正在动态创建一个表。我正在使用 JSP 页面从用户那里接收表值,然后在 MySql 数据库中从 servlet(通过调用用 java 文件编写的 createTable 函数)创建表。

在“CreateTable.java”中创建表的函数:

public void table(String name, String col1, String type1, String null1, String key) throws SQLException {

    String sql = "CREATE TABLE IF NOT EXISTS ? (id INT NOT NULL AUTO_INCREMENT, ? ? ? , PRIMARY KEY (?))";

    PreparedStatement stmt = conn.prepareStatement(sql);
    stmt.setString(1, "`myDb`."+name);
    stmt.setString(2, col1);
    stmt.setString(3, type1);
    stmt.setString(4, null1);
    stmt.setString(5, key);

    stmt.executeUpdate();
}

Servlet Controller.java:

if (action.equals("createTable")) {
    String name = request.getParameter("name");
    String null3 = request.getParameter("null1");
    String type3 = request.getParameter("type1");
    String key = request.getParameter("key");
    CreateTable createTable = new CreateTable(conn1);
    try {
        if (col2 == "" && col3 == "" && col4 == "" && col5 == "" && col6 == "" && col7 == ""    && col8 == "" && col9 == "" && col10 == "" && col11 == "" && col12 == "") {
            createTable.table(name, col1, type1, null1, key);
            request.getRequestDispatcher("/memberpanel.jsp").forward(request, response);
            // request.setAttribute("message", "");
            response.setContentType("text/html");
            out.println("<script type=\"text/javascript\">");
            out.println("window.alert('Your table created successfully')");
            out.write("setTimeout(function(){window.location.href='memberpanel.jsp'},1000);");
            out.write("setTimeout(function(){window.location.href='Index.jsp'},1000);");
            out.println("</script>");
        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        e.getMessage();
    }

执行时,我收到:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 1 行附近使用 ''`myDb`.admin' (id INT NOT NULL AUTO_INCREMENT, 'rescue' 'VARCHAR(750)' 'NOT NUL' 在 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:423) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在 com.mysql.jdbc.Util.getInstance(Util.java:386) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028) 在 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490) 在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651) 在 com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2683) 在 com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2144) 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2444) 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2362) 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2347) 在 org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:97) 在 org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:97) 在查询.CreateTable.table(CreateTable.java:478) 在控制器.Controller.doPost(Controller.java:504) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1502) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1458) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:745)

myDb 是我的数据库。 admin、rescue、not null、varchar(750)、rescue 是我对表名 col 的测试值。名称、空值或非空值、数据类型和主键。

我还尝试相应地更改语法,例如没有数据库名称和许多东西,但仍然收到相同的错误。 与数据库的连接工作正常。

如果有人可以帮忙,

提前致谢。

【问题讨论】:

  • 您的代码永远不会被调用 - 您需要学习如何在 Java 中比较字符串。

标签: java mysql


【解决方案1】:

您不能将这样的查询参数用于“非值”占位符。

相反,在 Java 中将查询构建为单个字符串,然后执行该字符串。

你可以使用String.format()获得类似的东西:

String query = String.format("CREATE TABLE IF NOT EXISTS %s (id INT NOT NULL AUTO_INCREMENT, %s %s %s , PRIMARY KEY (%s))", "`myDb`."+name, col1, type1, null1, key);

【讨论】:

  • 在没有经过某种健全性检查的情况下,切勿接受外部输入到 SQL 语句中。
  • 但它仍然不起作用,它说“表定义不正确;只能有一个自动列,并且必须定义为一个键”,当我没有为主键输入任何值时-肯定会显示“您的 SQL 语法有错误;请检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '))' 附近使用正确的语法”,因为缺少主键 (%s) 值.请帮忙。
  • @Abhishek 没有密钥时key 的值是多少? (即空、空白、?)
  • @std 我严重怀疑创建表的实用程序方法有可能是外部/不受信任的客户端。
  • 所以总是信任客户?有从不出现问题的机会吗?什么时候有一种简单的方法可以确定?
猜你喜欢
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 2018-01-26
  • 2012-04-10
  • 1970-01-01
  • 2011-11-20
相关资源
最近更新 更多