Кортежи не вставляются последовательно в таблицу базы данных [PostgreSQL]

Я пытаюсь вставить 10 значений формата "typename_" + i где я - счетчик цикла в таблице с именем roomtype с атрибутами typename (первичный ключ символа типа SQL варьируется (45)) и samplephoto (это может быть NULL, и я не занимаюсь этим сейчас). Что мне кажется странным, так это то, что кортежи вставляются в другом порядке, чем приращение счетчика цикла. То есть: typename_1 typename_10 typename_2 typename_3 ...

Я полагаю, это не очень важно, но я не могу понять, почему это происходит. Я использую PostgreSQL 9.3.4, pgAdmin III версии 1.18.1 и Eclipse Kepler.

Код Java, который создает соединение (используя драйвер JDBC) и выполняет запрос:

import java.sql.*;
import java.util.Random;

public class DBC{
    Connection _conn;

    public DBC() throws Exception{


        try{
            Class.forName("org.postgresql.Driver");
        }catch(java.lang.ClassNotFoundException e){
            java.lang.System.err.print("ClassNotFoundException: Postgres Server JDBC");
            java.lang.System.err.println(e.getMessage());
            throw new Exception("No JDBC Driver found in Server");
        }

        try{

            _conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/hotelreservation","user", "0000");
            ZipfGenerator p = new ZipfGenerator(new Random(System.currentTimeMillis()));
            _conn.setCatalog("jdbcTest");
            Statement statement = _conn.createStatement();
            String query;

            for(int i = 1; i <= 10; i++){
                String roomtype_typename = "typename_" + i;
                query = "INSERT INTO roomtype VALUES ('" + roomtype_typename + "','" + "NULL" +"')";
                System.out.println(i);
                statement.execute(query);
            }


        }catch(SQLException E){
            java.lang.System.out.println("SQLException: " + E.getMessage());
            java.lang.System.out.println("SQLState: " + E.getSQLState());
            java.lang.System.out.println("VendorError: " + E.getErrorCode());
            throw E;
        }

    }

}

Но то, что я получаю в таблице pgAdmin:

таблица pgAdmin

3 ответа

Решение

Это недоразумение. В таблице базы данных нет естественного одера. Порядок, который вы видите, является произвольным (однако Postgres выбирает чтение кортежей из кучи), если вы не добавите ORDER BY,

По умолчанию pgAdmin упорядочивает строки по первичному ключу (если не указано иное). Ваш столбец имеет тип varchar и строки упорядочены в алфавитном порядке (согласно вашей текущей локали). Все по замыслу, все как и должно быть.

Чтобы упорядочить строки, как вы ожидаете, вы можете добавить в тексте 0.

...
typename_0009
typename_0010
...

Правильное решение будет иметь числовой столбец только с номером, хотя. Вы можете быть заинтересованы в натуральной сортировке. Вы также можете быть заинтересованы в serial колонка.

Вы не видите порядок, в котором PostgreSQL хранит данные, а порядок, в котором их отображает pgadmin.

edit table Функция pgadmin автоматически сортирует данные по первичному ключу по умолчанию. это то, что вы видите.

Как правило, базы данных хранят данные таблиц в любом удобном порядке. Поскольку вы не поставили преднамеренно ЗАКАЗ, вы не имеете права заботиться о том, в каком порядке он находится.

Я предполагаю, что вывод упорядочен по алфавиту... если вы создадите typename_1 через typename_9, все должно быть в порядке. Вы также можете использовать typename_01 (заполненный нулями), чтобы получить правильный заказ.

если вы не уверены в этом, вы также можете добавить спящий режим между операторами вставки и записать время вставки в базу данных (в виде столбца).

Другие вопросы по тегам