Java 自动递增主键

Java 自动递增主键,java,sql,eclipse,Java,Sql,Eclipse,我有一个问题与自动增量,同一时间的数字改变,而不是保持增量,因为我定义。 附上表格的代码和图片 // Table 3 creation (Coupon) try { java.sql.Statement stmt3 = conn.createStatement(); sql = "create table Coupon(" + "ID bigint not null primary key generated always as ident

我有一个问题与自动增量,同一时间的数字改变,而不是保持增量,因为我定义。 附上表格的代码和图片

    // Table 3 creation (Coupon)
    try {
    java.sql.Statement stmt3 = conn.createStatement();
    sql = "create table Coupon("
            + "ID bigint not null primary key generated always as identity(start with 1, increment by 1), "
            + "TITLE varchar(30) not null, " 
            + "START_DATE DATE not null, " 
            + "END_DATE DATE not null,"
            + "AMOUNT INTEGER not null," 
            + "TYPE varchar(10) not null," 
            + "MESSAGE varchar(30) not null,"
            + "PRICE double not null,"
            + "IMAGE varchar(200) not null)";
    stmt3.executeUpdate(sql);
    System.out.println("success:" + sql);
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }

您不会用数据库标记问题。但是,没有数据库保证自动递增/串行/标识列始终只递增“1”

这样的保证有很多开销

相反,保证是当列是唯一的时,下一个值将大于上一个值,并且差值将是增量的倍数

无间隙增量需要大量工作的一些原因:

  • 删除记录会删除值
  • 回滚事务可能会“用完”值
  • 并行数据库可以缓存不同节点上的值

有很多方法可以解决这个问题,但这些方法代价高昂,而且通常是不必要的。

似乎有人插入并删除了99行,或者有人修改了数据库本身的当前自动增量值。数据库没有理由跳过99个值。