2014-08-28 175 views
1

我有一个程序,它在执行时会从文件中获取大量单词,并将它们插入到数据库中,插入后如果该单词插入两次,则会计算“ IDF“再次使用触发器。问题是,如果我这样做,直接到MySQL它有没有问题,但如果我这样做Java的返回此错误:java.sql.SQLException:子查询返回多于一行

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 ; 
+1

尝试手动运行:'(SELECT LOG((SELECT COUNT(*)FROM文件)/(SELECT COUNT (DocID)FROM IndiceInv WHERE Term = new.Term))FROM Doc,IndiceInv)'(将相关值赋给'new.Term'等) – alfasin 2014-08-28 05:55:46

+0

我看到了,我得到多个结果,并且不能分配给一个单细胞。 – arturojain 2014-08-28 06:06:58

+1

你明白了! :) – alfasin 2014-08-28 06:11:58

回答

2

尝试手动运行:

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

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