【问题标题】:H2 Database Primary Key on Create创建时的 H2 数据库主键
【发布时间】: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 的列,你需要定义它。

标签: database h2


【解决方案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 数据库行永远不会相同。无论如何忽略这一行,只写上面的时间戳和值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2013-01-31
  • 1970-01-01
  • 2019-10-06
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多