sql - 元组没有按顺序插入数据库表中?

标签 sql postgresql jdbc insertion pgadmin

我正在尝试插入 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 表中得到的是:

pgAdmin table

最佳答案

这是误会。关系数据库表中没有“自然”顺序。虽然行通常按顺序插入到包含表的物理文件中,但范围广泛的事件可以重新调整物理顺序。除了基本(非并行)顺序扫描之外,执行任何操作的查询都可能以任何适当的顺序返回行。这是根据标准 SQL。

您看到的顺序是任意的,除非您将 ORDER BY 添加到查询中。

pgAdmin3 默认按主键对行进行排序(除非另有说明)。您的专栏类型为 varchar并且行按字母顺序排列(根据您当前的语言环境)。一切都按照设计,一切都应该如此。

要像您预期的那样对行进行排序,您可以在文本中填充一些“0”:

...
typename_0009
typename_0010
...

不过,正确的解决方案应该是有一个只有数字的数字列。

您可能对 感兴趣.您可能还对 serial 感兴趣专栏。

关于sql - 元组没有按顺序插入数据库表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22966699/

相关文章:

sql - 如何将包含列表的变量传递给动态 SQL 查询?

java - 使用java代码将图片插入数据库(sqlite)。我应该怎么办?

java - 查询与更新

sql - 每个优秀的数据库/SQL 开发人员都应该能够回答的问题

sql - Postgres/ANSI SQL 系统如何将 'count' 聚合与 GROUP BY 字段相关联

java - 使用 Java/Scala 存储/检索 BYTEA 和 BLOB : "java.sql.SQLFeatureNotSupportedException"

java - hibernate 和准备好的语句

java - 如何检索 ResultSet 大小

postgresql - Go database/sql - 重新连接时发出命令

sql - 没有在触发器函数中选择表的权限