我正在尝试插入10个格式为"typename_" + i
的值,其中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。
创建连接(使用JDBC驱动程序)并进行查询的Java代码是:
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表中得到的是:
这是一种误解。关系数据库表中没有“自然”顺序。通常,通常将行按顺序插入到保存表的物理文件中,但是各种各样的活动可以重新排列物理顺序。除了基本(非并行)顺序扫描外,查询所做的任何事情都可能以任何适当的顺序返回行。这是根据标准SQL进行的。
我猜想,输出是通过字母排序的...如果您通过typename_9创建typename_1,则一切正常。您还可以使用typename_01(用零填充)来获取正确的顺序。
您没有看到PostgreSQL存储数据的顺序,而是pgadmin显示数据的顺序。