【问题标题】:java.sql.SQLException: Error preparing query: No tables usedjava.sql.SQLException:准备查询时出错:未使用表
【发布时间】:2017-04-15 06:51:22
【问题描述】:

我正在使用准备好的语句来插入 WHERE NOT EXISTS。我尝试了不同的方法,但它根本不起作用。 我用catch (SQLException sqle) 发现的错误是

java.sql.SQLException:准备查询时出错:未使用表

我的代码是:

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,它会打印此错误:

原因:org.mariadb.jdbc.internal.util.dao.QueryException:准备查询时出错:未使用表

我也尝试过:

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

错误变化:

错误准备查询:您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的 'WHERE NOT EXISTS (SELECT * FROM calendario WHERE year = ? AND mes = ? AND dia = ' 附近使用正确的语法

请帮帮我。

【问题讨论】:

  • select 中没有 from 子句。
  • 你可能想要"INSERT INTO calendario (year, mes, dia, date) " + "VALUES(?,?,?,?) " + "WHERE NOT EXISTS (SELECT * FROM calendario WHERE " + "year=? AND mes=? AND dia=?)"
  • 您的数据架构和字段名称要么使用完整的西班牙语,要么使用完整的英语,不要混合使用!
  • 建议您阅读INSERT mariadb.com/kb/en/mariadb/insert 的语法这部分SQL 很奇怪:(SELECT ? as year,? as mes ,? as dia,? as date) 您正在选择但不是从任何东西。
  • anio,fecha...到处都是实践...

标签: java mysql sql mariadb


【解决方案1】:

去掉两个SELECTs,把INSERT变成INSERT IGNORE

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2014-10-20
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多