我正在尝试插入 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。
您看到的顺序是任意的,除非您将 ORDER BY
添加到查询中。
pgAdmin3 默认按主键对行进行排序(除非另有说明)。您的专栏类型为 varchar
并且行按字母顺序排列(根据您当前的语言环境)。一切都按照设计,一切都应该如此。
要像您预期的那样对行进行排序,您可以在文本中填充一些“0”:
...
typename_0009
typename_0010
...
不过,正确的解决方案应该是有一个只有数字的数字列。
您可能对 natural-sort 感兴趣.您可能还对 serial
感兴趣专栏。
关于sql - 元组没有按顺序插入数据库表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22966699/