数据库序列

Postgresql

表结构和序列

DROP SEQUENCE IF EXISTS CDNS_TEST_ID_SEQ;
CREATE SEQUENCE CDNS_TEST_ID_SEQ
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;

DROP TABLE IF EXISTS test_table;
CREATE TABLE test_table
(
  ID               INTEGER NOT NULL DEFAULT NEXTVAL('CDNS_TEST_ID_SEQ'::REGCLASS),
  VALUE           BIGINT
);
ALTER TABLE ONLY test_table ADD CONSTRAINT test_table_PKEY PRIMARY KEY (ID);

模型和主键ID策略-IDENTITY

@Data
@Entity
@Table(name = "test_table")
public class TestTable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    private int id;
    
    @Column
    private long value;
}
插入数据测试
  • insert into test_table(value) values(10);
    数据库序列会自动增加,因为没有设置ID值,数据库会取序列来增加对应ID值。

  • insert into test_table values(5, 10);
    数据库序列不会增加。

  • 程序插入数据,程序中不指定ID值。数据库序列会增加。

  • 程序插入数据,程序制定了ID值。数据库序列会增加。
    重点:实际插入的ID并不是制定的ID值,而是序列的值

第二种情况会引发数据库中ID值和序列不一致的问题。手动在数据库指定ID插入的情况,序列值不会增长。

模型和主键ID策略-SEQUENCE

@Data
@Entity
@Table(name = "test_table")
public class TestTable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "charge_seq")
    @SequenceGenerator(name="charge_seq", sequenceName="CDNS_TEST_ID_SEQ")
    @Column(name = "id", unique = true, nullable = false)
    private int id;
    
    @Column
    private long value;
}
插入数据测试

结果同IDENTITY

解决办法

在手动显示插入带有ID的数据后,需要执行下边的语句,修复最大序列。
select setval('CDNS_TEST_ID_SEQ', (select max(id) from test_table));

你可能感兴趣的:(数据库序列)