概念:
显示插入---插入的时候指定id
隐式插入---插入的时候不指定id
PostgreSQL 有三种自增方式 sequence,serial,identity
对比:
1.相同点
(1)三种方法本质上都是序列,因此大多数特性都是相同的均可通过 pg_sequences 视图查询信息显式插入/导入数据后,序列最大值不会自动更新
(2)可以手动设置序列值
(3)truncate table 序列值不会重置
(4)回滚事务序列值不会回退
2.不同点
1,sequence在所有数据库中的性质都一样,它是跟具体的字段不是强绑定的,其特点是支持多个对个对象之间共享。
sequence作为自增字段值的时候,对表的写入需要另外单独授权sequence(GRANT USAGE ON SEQUENCE
test_old_id_seq;) sequence类型的字段表,在使用CREATE TABLE new_table LIKE
old_table的时候,新表的自增字段会已久指向原始表的sequence
结论:对于自增字段,无特殊需求的情况下,sequence不适合作为“自增列”,作为最最次选。
2,identity本质是为了兼容标准sql中的语法而新加的,修复了一些serial的缺陷,比如无法通过alter
table的方式实现增加或者删除serial字段
2.1 identity定义成generated by default as identity也允许显式插入,
2.2 identity定义成always as identity,加上overriding system value也可以显式不插入 结论:identity是serial的“增强版”,更适合作为“自增列”使用。
3,sequence,serial,identity共同的缺点是在显式插入之后,无法将自增值更新为表中的最大Id,这一点再显式插入的情况下是潜在自增字段Id冲突的
结论:自增列在显式插入之后,一定要手动重置为表的最大Id。