始终生成为 h2 DDL 中的身份

2024-02-21

在我们的项目中,我们使用 postgres 数据库作为开发到生产环境,对于 junit 测试,我们在内存数据库中使用 H2。

想知道我们是否可以使用 GENERATE ALWAYS AS IDENTITY 创建 DDL 以在 H2 数据库中插入具有唯一 id 的每一行。


IDENTITY

在 H2 中,使用IDENTITY http://h2database.com/html/datatypes.html#identity_type类型,用于自动生成递增的 64 位长整数。

H2 中使用的单字语法是以下语法的缩写变体GENERATED … AS IDENTITY定义在SQL:2003 https://en.wikipedia.org/wiki/SQL%3A2003标准。请参阅 PDF 文档中的摘要SQL:2003 已发布 https://web.archive.org/web/20071011220454/http://www.sigmod.org/sigmod/record/issues/0403/E.JimAndrew-standard.pdf。其他数据库正在实现这一点,比如Postgres https://blog.2ndquadrant.com/postgresql-10-identity-columns/.

CREATE TABLE event_ 
( 
    pkey_ IDENTITY NOT NULL PRIMARY KEY ,  -- ⬅ `identity` = auto-incrementing long integer.
    name_ VARCHAR NOT NULL ,
    start_ TIMESTAMP WITH TIME ZONE NOT NULL , 
    duration_ VARCHAR NOT NULL
) 
;

用法示例。不需要为我们传递一个值pkey列值,因为它是由 H2 自动生成的。

INSERT INTO event_ ( name_ , start_ , stop_ )
VALUES ( ? , ? , ? ) 
;

在Java中。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
OffsetDateTime start = ZonedDateTime.of( 2021 , Month.JANUARY , 23 , 19 , 0 , 0 , 0 , z ).toOffsetDateTime() ; 
Duration duration = Duration.ofHours( 2 ) ;

myPreparedStatement.setString( 1 , "Java User Group" ) ;
myPreparedStatement.setObject( 2 , start ) ;
myPreparedStatement.setString( 3 , duration.toString() ) ; 

返回生成的密钥

如果您想返回生成的密钥,请参阅类似的示例代码我的回答 https://stackoverflow.com/a/53605454/642706.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

始终生成为 h2 DDL 中的身份 的相关文章

随机推荐