【问题标题】:Java create table sql statementJava建表sql语句
【发布时间】:2020-12-15 13:25:17
【问题描述】:

我想用这种方法创建一个新的 mySQL 表。 数据库连接工作正常。 我做了很多这样的工作声明,但是这个,创建一个表是行不通的。 所以错误必须在这几行代码中。 在底部我添加了错误消息。

 public void createNewTable(){
        DatabaseConnection connectNow = new DatabaseConnection();
        Connection connectDb = connectNow.getConnection();
        String tableName = "users";
        try {
               String createTable = "CREATE TABLE ? (firstname varchar(30), lastname varchar(30), tel integer" +
                "email varchar(40), arrive_stamp timestamp, quit_stamp timestamp)";
            PreparedStatement myStmt = connectDb.prepareStatement(createTable);
            myStmt.setString(1, tableName);
            myStmt.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
            e.getCause();
        }

    }






 Illegal operation on empty result set.
    java.sql.SQLSyntaxErrorException: 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 ''users' (firstname varchar(30), 
lastname varchar(30), tel integer, email varchar' at line 1

【问题讨论】:

    标签: java mysql sql


    【解决方案1】:

    数据库对象名称(包括表名称),不能绑定到占位符。您必须对表名进行硬编码或使用字符串连接。以下将起作用:

    try {
        String sql = "CREATE TABLE users (firstname varchar(30), lastname varchar(30), tel integer, " +
                     "email varchar(40), arrive_stamp timestamp, quit_stamp timestamp)";
        PreparedStatement myStmt = connectDb.prepareStatement(sql);
        myStmt.executeUpdate();
    }
    catch (Exception e) {
        e.printStackTrace();
        e.getCause();
    }
    

    【讨论】:

    • 谢谢你的回答 :) 但是像这样我对 SQL 注入不安全吗?
    • 不,相反,该语句的外部输入为零,因此它是 100% 免受 SQL 注入的安全。从外部传入表名是不寻常的。我并不是说没有这样的用例,只是在你的情况下它可能表明存在设计问题。
    • 你说得对。但从长远来看,我计划用另一种方法的输入值替换“用户”。这就是我使用准备好的声明的原因。有什么办法可以做到这一点并且仍然可以安全地免受 SQL 注入?
    • 如果这确实是您的要求,那么您将不得不自己消除输入名称。这意味着确保它没有空格,是单个“单词”,并且不是 SQL 关键字等。它仍然存在风险。
    • 好的,非常感谢您的帮助:)。还有一个问题:您的代码示例正在运行,但为什么我会收到此错误消息:“Illegal operation on empty result set.”?
    【解决方案2】:

    您在telemail 列之间缺少,。正如 Tim 在评论中提到的,您应该在 sql 语句本身中使用表名。

    你的sql语句应该是

    String createTable = "CREATE TABLE your_table_name (firstname varchar(30), lastname varchar(30), tel integer, " + -- added , at the end
                    "email varchar(40), arrive_stamp timestamp, quit_stamp timestamp)";
            
    

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多