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