创建时的 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 数据库主键的主要内容,如果未能解决你的问题,请参考以下文章
在 H2 数据库引擎中为 UUID 类型的主键列指定默认值?