【问题标题】:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'bus' already existscom.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表'bus'已经存在
【发布时间】:2015-07-13 05:55:13
【问题描述】:

我正在尝试使我的代码顺利运行,但是在第一次插入之后并且当表存在时,我总是在创建 fisr 表并插入数据之后出现此错误 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'bus' already exists 并发生此错误?!如果不创建表,我只想检查表是否存在,如果是,则插入数据,只需更新数据。

数据库类:

package org.busTracker.serverSide;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Database {

    public void connection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("jar works :) ");

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

    public void insertData(String mac, int route, float latitude,
            float longitude) {

        connection();
        String host = "jdbc:mysql://localhost/busTracker";
        String user = "root";
        String password = "";

        try {
            Connection con = DriverManager.getConnection(host, user, password);

            // Create a statement
            Statement stt = con.createStatement();

            // Check whether table exists.
            boolean rest = stt.execute("SHOW TABLES like 'bus' ");

            if (rest) {

                PreparedStatement prep = con
                        .prepareStatement("REPLACE INTO bus(mac, route, latitude, longitude)"
                                + "VALUES( ?, ?, ? , ? )");
                prep.setString(1, mac);
                prep.setInt(2, route);
                prep.setFloat(3, latitude);
                prep.setFloat(4, longitude);
                prep.executeQuery();

            } else {

                // Create bus table
                stt.execute("CREATE TABLE bus"
                        + "(id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,"
                        + "mac VARCHAR(30) NOT NULL UNIQUE,"
                        + "route int(11) NOT NULL,"
                        + "latitude FLOAT(10,6) NOT NULL,"
                        + "longitude FLOAT(10,6) NOT NULL,"
                        + "created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)");

                PreparedStatement prep = con
                        .prepareStatement("REPLACE INTO bus(mac, route, latitude, longitude)"
                                + "VALUES( ?, ?, ? , ? )");
                prep.setString(1, mac);
                prep.setInt(2, route);
                prep.setFloat(3, latitude);
                prep.setFloat(4, longitude);
                prep.executeQuery();

            }

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

}

【问题讨论】:

    标签: java sql


    【解决方案1】:

    您可能希望使用 CREATE TABLE IF NOT EXISTS 语法

    https://dev.mysql.com/doc/refman/5.5/en/create-table.html

    这将帮助您避免此类错误

    但我会检查是否

     boolean rest = stt.execute("SHOW TABLES like 'bus' ");
    

    正常工作,你可能会得到错误的结果并执行错误的操作

    【讨论】:

    【解决方案2】:

    您可以通过为 property 使用适当的 valuenone、create、update...)来修复异常hibernate.hbm2ddl.auto

    <property name="hibernate.hbm2ddl.auto"> xxx </property> <!-- xxx : create, update, none -->
    

    1. 如果数据库没有表并且您想在运行时(使用 Hibernate)创建它们,您有两个选择来设置属性 hibernate.hbm2ddl 的值。 auto 作为 createupdate

    • create - 它将创建所有表(如果存在则首先删除所有表 然后再次创建所有表)
    • 更新 - 它只会创建那些在数据库中不存在的表

    2.如果数据库有所有的表并且你不想创建 那么您可以选择将属性 hibernate.hbm2ddl.auto 的值设置为 none

    【讨论】:

      猜你喜欢
      • 2016-04-16
      • 2016-08-23
      • 2020-05-15
      • 1970-01-01
      • 2012-04-20
      • 2016-05-19
      • 2013-11-20
      • 2016-07-07
      • 2015-01-22
      相关资源
      最近更新 更多