Кортежи не вставляются последовательно в таблицу базы данных [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:
3 ответа
Это недоразумение. В таблице базы данных нет естественного одера. Порядок, который вы видите, является произвольным (однако Postgres выбирает чтение кортежей из кучи), если вы не добавите ORDER BY
,
По умолчанию pgAdmin упорядочивает строки по первичному ключу (если не указано иное). Ваш столбец имеет тип varchar
и строки упорядочены в алфавитном порядке (согласно вашей текущей локали). Все по замыслу, все как и должно быть.
Чтобы упорядочить строки, как вы ожидаете, вы можете добавить в тексте 0.
...
typename_0009
typename_0010
...
Правильное решение будет иметь числовой столбец только с номером, хотя. Вы можете быть заинтересованы в натуральной сортировке. Вы также можете быть заинтересованы в serial
колонка.
Вы не видите порядок, в котором PostgreSQL хранит данные, а порядок, в котором их отображает pgadmin.
edit table
Функция pgadmin автоматически сортирует данные по первичному ключу по умолчанию. это то, что вы видите.
Как правило, базы данных хранят данные таблиц в любом удобном порядке. Поскольку вы не поставили преднамеренно ЗАКАЗ, вы не имеете права заботиться о том, в каком порядке он находится.
Я предполагаю, что вывод упорядочен по алфавиту... если вы создадите typename_1 через typename_9, все должно быть в порядке. Вы также можете использовать typename_01 (заполненный нулями), чтобы получить правильный заказ.
если вы не уверены в этом, вы также можете добавить спящий режим между операторами вставки и записать время вставки в базу данных (в виде столбца).