auto incremented number generation for a non primary key column
我对主键使用了以下id生成策略。
1 2 3 4 | @Id @GeneratedValue(strategy = IDENTITY) @Column(name ="id", unique = true, nullable = false, insertable = false, updatable = false) private Integer id; |
我想对非主键列执行相同的操作。
[a]为此类密钥定义自动生成方案的语义是什么
[b]是否可以保证生成的数字在数字上没有间隙。
如果删除
1 2 3 | @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name ="columnName", unique = true, nullable = false, insertable = false, updatable = false) private Integer columnName; |
通过允许数据库生成列值,您将确保没有间隙,除非删除和回滚。
例如,如果删除表中间的行,则将创建一个不会被填充的空白。
通常,确保自动增加的值始终在增加,但是可能存在间隙。
例如,如果同时发生两次插入并回滚一个事务,则可能会发生间隙(如果数据库要确保没有间隙,则所有事务都需要序列化。)
编辑
从此页面获取的oracle示例:
1 2 3 4 5 | CREATE SEQUENCE supplier_seq MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 20; |
对于序列,高速缓存选项指定将在内存中存储多少序列值以加快访问速度。
使用缓存创建序列的不利之处在于,如果发生系统故障,所有未使用的缓存序列值将"丢失"。这样会导致分配的序列值出现"间隙"。当系统重新启动时,Oracle将在序列中从其上次中断的地方开始缓存新的数字,而忽略所谓的"丢失"序列值。