java.sql.SQLException : Error preparing query: No tables used

标签 java mysql sql mariadb

我正在使用准备好的语句来插入不存在的地方。我尝试过不同的方法,但根本行不通。 我用 catch (SQLException sqle) 捕获的错误是

java.sql.SQLException: Error preparing query: No tables used

我的代码是:

try {
                        //hacer los inserts
                        sql = "INSERT INTO calendario (year, mes, dia, date) "
                                + "SELECT * FROM (SELECT ? as year,? as mes ,? as dia,? as date) AS tmp "
                                + "WHERE NOT EXISTS (SELECT * FROM calendario WHERE "
                                + "year=? AND mes=? AND dia=?)";

                        injerto = conn.prepareStatement(sql);
                        injerto.setInt(1, year);
                        injerto.setInt(2, mes);
                        injerto.setInt(3, dia);
                        injerto.setDate(4, sqldate);
                        injerto.setInt(5, year);
                        injerto.setInt(6, mes);
                        injerto.setInt(7, dia);
                        injerto.addBatch();
                        injerto.executeBatch();

                    }  catch (SQLException sqle) {
                        sqle.printStackTrace();
                        System.out.println("Calendario dice: me muero");
                        System.exit(0);
                    }

我正在使用 MariaDB,它会打印此错误:

Caused by: org.mariadb.jdbc.internal.util.dao.QueryException: Error preparing query: No tables used

我也尝试过:

sql = "INSERT INTO calendario (year, mes, dia, date) "
                                    + "SELECT ?,?,?,?  "
                                    + "WHERE NOT EXISTS ("
                                    + "SELECT * FROM calendario "
                                    + "WHERE year = ? AND mes = ? AND dia = ?)";

错误发生变化:

Error preparing query: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE NOT EXISTS (SELECT * FROM calendario WHERE year = ? AND mes = ? AND dia = ' at line 1

请帮助我。

最佳答案

去掉两个SELECT,将INSERT变成INSERT IGNORE:

INSERT IGNORE INTO calendario (year, mes, dia, date)
    VALUES
    ( ?, ?, ?, ? )

如果新行尚不存在,则将插入新行。 并添加 UNIQUE(year, mes, dia) 以便它知道何时“忽略”。

关于java.sql.SQLException : Error preparing query: No tables used,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40896995/

相关文章:

php - Laravel - 重命名表后 - 调用未定义的方法 updateOrCreate()

mysql - 如何提取组的所有行?

c# - 使用 Entity Framework 的唯一主键

java - JGraphT - 将 BFS 应用于 WeightedGraph

mysql - 从字符串 "select CustName from tblCustMst "到类型 'Integer' 的转换无效

python - 似乎无法转储 mysql 数据库

php - 如何在 PHP 中多次在 SQL 查询中漫游

java - 来自嵌套 POJO 的比较器

java - 如何在没有任何监听驱动程序的情况下在java中实现嗅探器?

java - Spock 认为测试类的内部枚举应该是 Spec 的属性