【问题标题】:java.sql.SQLException: Subquery returns more than 1 rowjava.sql.SQLException:子查询返回多于 1 行
【发布时间】:2014-08-28 05:50:30
【问题描述】:

我有一个程序,当它执行时,它会从文件中获取大量单词并将它们插入到数据库中,如果单词被插入两次,则在插入后,它会使用触发器再次计算“IDF”。问题是,如果我直接在 MySQL 中执行此操作,则没有问题,但如果我在 Java 上执行此操作,则会返回此错误:

Exception in thread "main" java.sql.SQLException: Subquery returns more than 1 row
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1086)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2617)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2828)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2777)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:949)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:795)
    at model.Consultas.altaBajaCambio(Consultas.java:29)
    at model.DatosBD.agregarPalabra(DatosBD.java:23)
    at search.Search.main(Search.java:36)
Java Result: 1

我认为问题出在 st.execute() 上,因为它只返回一个 int,但我在网上搜索了解决方案,但找不到。

查询:

String query2 = "INSERT IGNORE INTO Search.IndiceInv (DocID, Term, TF) VALUES ("+doc+",'"+term+"',1) ON DUPLICATE KEY UPDATE `TF` = `TF` + 1;";
c.altaBajaCambio(query2);

执行:

try (Connection con = c.getConnection()) {
            if (con == null) {
                System.out.println("No hay conexion");
            } else {
                Statement st = con.createStatement();
                st.execute(query);
            }

数据库:

-- -----------------------------------------------------
-- Table `Search`.`Doc`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Search`.`Doc` (
  `DocID` INT NOT NULL,
  PRIMARY KEY (`DocID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Search`.`Term`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Search`.`Term` (
  `Term` VARCHAR(45) NOT NULL,
  `IDF` INT NOT NULL,
  PRIMARY KEY (`Term`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Search`.`IndiceInv`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Search`.`IndiceInv` (
  `DocID` INT NOT NULL,
  `Term` VARCHAR(45) NOT NULL,
  `TF` INT NOT NULL,
  PRIMARY KEY (`DocID`, `Term`),
ENGINE = InnoDB;

触发器:

delimiter //
create trigger IDF
after update on IndiceInv
for each row
begin
  update Term
  set IDF = (SELECT LOG((SELECT count(*) FROM Doc)/(SELECT count(DocID) FROM IndiceInv WHERE Term = new.Term)) FROM Doc, IndiceInv)
  where Term = new.Term;
end;//
delimiter ;

【问题讨论】:

  • 尝试手动运行:(SELECT LOG((SELECT count(*) FROM Doc)/(SELECT count(DocID) FROM IndiceInv WHERE Term = new.Term)) FROM Doc, IndiceInv)(将相关值赋值给new.Term等)
  • 我明白了,我得到了多个结果,并且不能分配给单个单元格。
  • 谢谢,你能把这个作为我可以检查的答案。

标签: java mysql


【解决方案1】:

尝试手动运行:

SELECT LOG((SELECT count(*) FROM Doc)/(SELECT count(DocID) FROM IndiceInv WHERE Term = new.Term)) FROM Doc, IndiceInv

(将相关值分配给 new.Term 等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 2013-08-18
    相关资源
    最近更新 更多