如何通过Java程序跳过MySql数据库中的前n行?

问题描述 投票:0回答:1

我有问题。我正在编写一个Java应用程序,它将移动一些文件。由于性能问题,用户可以选择要移动的文件数量。如果文件被移动,则我的数据库将使用新路径进行更新。我已经对此进行了编码,但是现在的问题是它仅适用于第一个文件,例如10个文件。然后,应用程序终止。因此,到目前为止,一切都按预期进行。现在,我想再次启动该应用程序,它将再次移动10个文件。现在的问题是,它再次从数据库的顶部开始,并尝试移动前10个文件,直到在我的应用程序的第一次运行中已经移动过。那么如何告诉我的程序它将跳过前10(n)个文件?

我有一个想法,用一和零为数据库生成一个新列。每个已移动的文件都将获得1,并且其默认设置为0。然后程序检查是否存在一个或零,如果存在一个,则仅继续下一行。但是我没有找到关于如何使用Java在数据库中创建列的方法。下一个问题是在运行应用程序后,将删除此列。

我试图编写一个过程,发现了这一点:

DELIMITER $$
CREATE PROCEDURE Alter_Table()
BEGIN
  DECLARE _count INT;
    SET _count =( SELECT COUNT(*)
              FROM INFORMATION_SCHEMA.COLUMNS
              WHERE TABLE_NAME = 'test_cm_documents' AND
                    COLUMN_NAME='subscribe_all');
  IF _count = 0 THEN
    ALTER TABLE test_cm_documents
    ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
        ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;
  END IF;
END$$
DELIMITER ;

如果我将其粘贴到mysql命令行中就可以了,但是当我尝试用Java程序执行它时就不起作用了。我也尝试将其另存为* .sql文件,但无法从Java程序执行。

我有两个Java程序,试图解决我的问题,但遇到几个错误。

import java.io.*;

public class CmdExec {

public static void main(String[] args) {
    try {
        String line;
        Process p = Runtime.getRuntime().exec(
                "mysql -u myuser -p xxxx -d cm_database -h 3306 -f C://Users//****//Desktop//procedure.sql");
        BufferedReader input =
                new BufferedReader
                    (new InputStreamReader(p.getInputStream()));
        while ((line = input.readLine()) != null) {
            System.out.println(line);
        }
        input.close();
    }catch(Exception err) {
        err.printStackTrace();
    }
}

}

错误:java.io.IOException:无法运行程序“ mysql”:CreateProcess错误= 2,达斯System kann die angegebene Datei nicht finden在java.lang.ProcessBuilder.start(未知来源)在java.lang.Runtime.exec(未知来源)在java.lang.Runtime.exec(未知来源)在CmdExec.main(CmdExec.java:8)由以下原因引起:java.io.IOException:CreateProcess错误= 2,Das系统看板天使之死在java.lang.ProcessImpl.create(本机方法)在java.lang.ProcessImpl。(未知来源)在java.lang.ProcessImpl.start(未知来源)...另外5个

第二个Java程序:

import java.sql.*;

public class startProcedure {

public static void main(String[] args) {
    try(Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/cm_database?allowPublicKeyRetrieval=true&SSL=false&serverTimezone=UTC",
            "myuser","xxxx");

            Statement delimiter = conn.createStatement();){

            String delimiterStr = 
                    "CREATE PROCEDURE Alter_Table() "
                    + " BEGIN "
                    + " DECLARE _count INT; "
                    + " SET _count =( SELECT COUNT(*) "
                                   + " FROM INFORMATION_SCHEMA.COLUMNS "
                                   + " WHERE TABLE_NAME='test_cm_documents' AND "
                                          + " COLUMN_NAME='subscribe_all'); "
                    + " IF _count = 0 THEN "
                        + " ALTER TABLE test_cm_documents"
                           + " ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,"
                           + " ADD COLUMN subscribe_category varchar(512) DEFAULT NULL "
                           + " END IF; "
                    + " END; "
                    ;

            delimiter.executeUpdate(delimiterStr);
    }catch(SQLException ex) {
        ex.printStackTrace();
    }


}

    }

我收到以下错误:您的SQL语句中有错误。

也许有人可以帮助我,因为我对这个话题还很陌生。优秀的应用程序将仅跳过n行。我认为这将是最简单的解决方案。

java mysql sql jdbc
1个回答
-1
投票

使用Cte查询可跳过前10(n)个文件并获取最近保存的同一行。例如

GID   MID   ROWNUMBER
1      1      1
1      2      1
1      2      2
1      2      3 
2      1      1
2      2      1
2      2      2
2      3      5
2      4      4

with Demo as
(
select *, ROW_NUMBER() over (partition by GID, MID order by UID) as ROWNUMBER  from Table1 where DateEntered > '2015-06-13 00:00:00.000'
)

创建表

UID     GID   MID   ROWNUMBER
1        1      1      1
2        1      2      1
3        1      2      2
4        1      2      3 
5        2      1      1
6        2      2      1
7        2      2      2
8        2      3      5
9        2      4      4

select  * from Demo ROWNUMBER  = 10
© www.soinside.com 2019 - 2024. All rights reserved.