數(shù)據(jù)庫序列

Postgresql

表結(jié)構(gòu)和序列

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;
}
插入數(shù)據(jù)測試
  • insert into test_table(value) values(10);
    數(shù)據(jù)庫序列會自動增加,因為沒有設(shè)置ID值,數(shù)據(jù)庫會取序列來增加對應(yīng)ID值。

  • insert into test_table values(5, 10);
    數(shù)據(jù)庫序列不會增加。

  • 程序插入數(shù)據(jù),程序中不指定ID值。數(shù)據(jù)庫序列會增加。

  • 程序插入數(shù)據(jù),程序制定了ID值。數(shù)據(jù)庫序列會增加。
    重點:實際插入的ID并不是制定的ID值,而是序列的值

第二種情況會引發(fā)數(shù)據(jù)庫中ID值和序列不一致的問題。手動在數(shù)據(jù)庫指定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;
}
插入數(shù)據(jù)測試

結(jié)果同IDENTITY

解決辦法

在手動顯示插入帶有ID的數(shù)據(jù)后,需要執(zhí)行下邊的語句,修復(fù)最大序列。
select setval('CDNS_TEST_ID_SEQ', (select max(id) from test_table));

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容