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));