Есть ли способ прокрутить все строки в SQL после удаления некоторых строк в середине моей базы данных? - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь прокрутить всю свою базу данных (для некоторых действий, таких как показать все константы и т. Д.), Все в порядке, пока я не удалил несколько строк в середине моей базы данных SQL. Я использую идентификатор лица в качестве основного ключа и пытаюсь прокрутить данные с помощью этого ключа. personId также автоматически увеличивается.

это моя база данных перед удалением, и я могу прекрасно прокрутить

+------------------------------+
| personId |  name  |  family  |
+------------------------------+
| 1        | name1  | family1  |
| 2        | name2  | family2  |
| 3        | name3  | family3  |
| 4        | name4  | family4  |
| 5        | name5  | family5  |
| 6        | name6  | family6  |
+------------------------------+

и это моя база данных после удаления

+------------------------------+
| personId |  name  |  family  |
+------------------------------+
| 1        | name1  | family1  | <-- num2 is deleted
| 3        | name3  | family3  | <-- num4 is deleted
| 5        | name5  | family5  |
| 6        | name6  | family6  |
+------------------------------+

IЯ уже пытался:

1. use ROW_NUMBER() function in WHERE clause.
2. reset personId number and auto incremental.
3. sort data by date created in Unix-time.

Но их логика неверна, а некоторые даже не работают.

Это код для получения определенной строкиБаза данных SQL. Там, где возникла моя основная проблема (= начинается).

Класс Person включает personId, имя и семейное свойство, а также метод Getter и Setter. Вы можете увидеть его в конце страницы.

public static Person getRow(int rowNumber) throws SQLException {
    String sql = "SELECT * FROM person WHERE personId = ?";
    ResultSet rs = null;
    try (
            Connection con = DriverManager.getConnection(...)
            PreparedStatement stmt = con.prepareStatement(sql);
    ) {
        stmt.setInt(1, rowNumber);
        rs = stmt.executeQuery();
        if (rs.next()) {            
            Person bean = new Person(rowNumber, rs.getString("name"), 
                                  rs.getString("family"));
            return bean;
        } else {
            System.err.println("No rows were found!");
            return null;
        }
    } catch (SQLException e) {
        System.err.println(e);
        return null;
    } finally {
        if (rs != null) {
            rs.close();
        }
    }
}

Это displayAllRows (), который будет вызывать getRow (int rowNumber) для 1, чтобы закончить как rowNumber.

public static void displayAllRows() throws SQLException {
    String sql = "SELECT * FROM profiles";
    try (
            Connection connection = DriverManager.getConnection(...)
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery(sql);
    ) {
        int rowNumber = 0;
        while (resultSet.next()) {
            Person bean = getRow(++rowNumber);
            System.out.println(bean.personId + ". " + bean.name + "  " + bean.family); 
        }

    } catch (SQLException e) {
        System.err.println(e);
    }
}

Вот класс человека

public class Person {

    private int personId;
    private String name;
    private String family;

    public Person(int personId, String name, String family) {
        this.personId = personId;
        this.name = name.trim();
        this.family = family.trim();
    }

    public Person() {}

    public int getPersonId() {return personId;}
    public void setPersonId(int personId) {this.personId = personId;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getFamily() {return family;}
    public void setFamily(String family) {this.family = family;}     
}

Я знаю, что есть другой и лучший способ отображения данных. Но не забывайте главный вопрос и основную цель всего этого.

Я ожидаю получить все данные, но вместо этого я получаю поврежденные данные, и сообщение об исключении строки не найдено.

Я ожидаю этого:

+-------------------------+
| Row |  name  |  family  |
+-------------------------+
| 1   | name1  | family1  |
| 2   | name3  | family3  |
| 3   | name5  | family5  |
| 4   | name6  | family6  |
+-------------------------+

Но вместо этого я получаю это:

+-------------------------+
| Row |  name  |  family  |
+-------------------------+
| 1   | name1  | family1  |
| 3   | name5  | family5  |
+-------------------------+

И 2 раза ошибка "Строка не найдена".

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

После долгих поисков я наконец-то нашел свой ответ.

Вы можете использовать метод resultSet.absolute (row_number) для этой цели. Напишите ваше тело метода getRow () следующим образом:

public static Person getRow(int rowNumber) throws SQLException {
    String sql = "SELECT * FROM profiles";
    try (
            Connection connection = DBUtil.getConnection();
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery(sql);
    ) {
        if (resultSet.absolute(rowNumber)) {
            return new Person(resultSet.getInt("personId"), resultSet.getString("name"), 
                       resultSet.getString("family"), resultSet.getString("nationalId"));
        } else {
            System.err.println("No row were found !");
            return null;
        }
    } catch (SQLException e) {
        System.err.println(e);
        return null;
    }
}

Конечно, вы получите всю свою базу данных таким способом. но он отлично работает для базы данных, такой же большой, как моя (;

0 голосов
/ 27 октября 2019

Причина здесь. Вы используете rowNumber для поиска personId. Вы не должны делать никаких предположений о том, какие значения имеют rowNumber. Вместо этого ищите по personId.

...