【问题标题】:GENERATE ALWAYS AS IDENTITY in h2 DDL在 h2 DDL 中始终生成身份
【发布时间】:2021-09-07 22:41:03
【问题描述】:

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

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

【问题讨论】:

标签: postgresql h2


【解决方案1】:

IDENTITY

在 H2 中,使用 IDENTITY 类型,用于自动生成递增的 64 位长整数。

H2 中使用的这种单字语法是 SQL:2003 标准中定义的 GENERATED … AS IDENTITY 的缩写变体。请参阅 PDF 文档 SQL:2003 Has Been Published 中的摘要。其他数据库正在实现这一点,such as Postgres

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

返回生成的密钥

如果您想返回生成的密钥,请参见类似Answer of mine 中的示例代码。

【讨论】:

    猜你喜欢
    • 2014-04-10
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多