创建时的 H2 数据库主键

Posted

技术标签:

【中文标题】创建时的 H2 数据库主键【英文标题】:H2 Database Primary Key on Create 【发布时间】:2016-09-07 12:17:28 【问题描述】:

如果我像这样在我的 h2 数据库中创建一个新表...

CREATE TABLE MAININCOMER(timestamp TIMESTAMP, value REAL);

这意味着当我写入表格时,ID 将被隐藏并自动递增,对吧? - (据我从教程和功能中了解到)

主键会自动分配给id吗?在只有 2 列的表类型中,主键到底有多重要?或者我应该作为最佳实践创建主键分配给时间戳的表?

CREATE TABLE MAININCOMER(timestamp TIMESTAMP PRIMARY KEY, value REAL);

谢谢,亚历克斯

【问题讨论】:

"表示ID会被隐藏" - NO.这意味着您的表将没有 ID 列 - 甚至没有“隐藏”列。如果你想要一个名为ID 的列,你需要定义它。 【参考方案1】:

试试这个:

create table mainincomer(id bigint auto_increment,t timestamp,value real,primary key(id))

【讨论】:

我真的不需要 id 列,因为我正在将电能表中的数据记录到具有 2 列时间戳和值的临时表中。如果我想将其写入数据库表,我猜这两个表需要相同。我需要为其中一列分配主键吗? 如果您使用外键,则必须使用主键或唯一键@Lexus【参考方案2】:

否:您的表格将没有 ID 列,因为它未在您的 DDL CREATE TABLE 中列出。

我知道添加这种自动递增列用作主键的最简单方法是ID IDENTITY。请小心,因为它是 H2 特有的,不可移植。

但它比任何其他数据库都要短得多:-D

请将您的 DDL 更改为这一整行:

CREATE TABLE MAININCOMER(id IDENTITY, timestamp TIMESTAMP, value REAL);

您可以像这样在 H2 Web 控制台中对其进行测试:

@loop 1000 insert into mainincomer (timestamp) values (now());

这将插入 1000 条记录,您会看到 ID 被定义为 BIGINT(19) NOT NULL,将为其分配一个 PRIMARY KEY 约束,并且它会自动递增。

使用时间戳作为主键被认为是一种不好的做法。很难确保唯一的约束,因为您可能有事件同时到达(有点,这取决于您的时间分辨率)。加整数更容易索引和查找。

【讨论】:

好的,让我们看看我想要实现的更大的图景。我有一个名为 DGLux5 的环境,我在这里连接到电表并在打开表时将数据记录到表中,它具有列行、时间戳和值。我需要将这些存储在数据库中,即 H2。现在我的数据表和 H2 表不必相同才能传输数据吗?导致我的下一个问题,我如何将数据表中的多条记录写入数据库?使用 INSERT INTO tbl_name VALUES(..., ...),(..., ...),(..., ...), ...., (..., ...); ?在 dglux 脚本环境 (javascript) 我可以使用 tableGetRows(@parent.table) 它给了我一个看起来像这样的结果 [[0,"2016-09-08T07:03:00.184","50.16"],[1,"2016 -09-08T07:05:00.340","50.17"]] - 我到底如何才能删除行列?删除时间戳周围的 " 并将其替换为 ' 并从值中删除 " 以最终给我这个 INSERT INTO tbl_name VALUES('2016-09-08T07:03:00.184',50.16), ('2016-09-08T07 :05:00.340',50.17); 您可以在不使用 ID 的情况下插入此数据:它将为您创建 id 值。如果您需要保留原始行信息,我建议insert into mainincomer (original_row,timestamp,value) values (10,"2016-09-08T07:03:00.184","50.16") 您也可以使用选择插入。假设您希望有一个链接到您的源数据的表(例如另一个 h2),那么您将执行 insert into mainincomer (original_row,timestamp,value) select * from linked_table 好的,我到了。我现在将这个插入到 mainincomer 值 (0,"2016-09-09T06:57:37.783","50.16"),(1,"2016-09-09T06:58:37.875","50.11"),(2 ,"2016-09-09T06:59:37.942","50.13");但是我不想写行号,这应该自动递增,因为源数据行和 h2 数据库行永远不会相同。无论如何忽略这一行,只写上面的时间戳和值?

以上是关于创建时的 H2 数据库主键的主要内容,如果未能解决你的问题,请参考以下文章

Liquibase 主键在 H2 上创建了两次

创建数据库时的 H2 文件嵌入模式运行脚本(未初始化连接)

为啥保留重复记录时h2复合主键不起作用?

在 H2 数据库引擎中为 UUID 类型的主键列指定默认值?

如何使用 Hibernate 和 H2 数据库自动生成主键 [重复]

使用 JAVA UUID 作为主键时 H2 内存数据库错误“数据转换错误转换”