H2数据库基于一列合并

Posted

技术标签:

【中文标题】H2数据库基于一列合并【英文标题】:H2 database Merge into based on one column 【发布时间】:2018-06-29 11:07:30 【问题描述】:

如果 loginId 已经存在,我想更新或插入此表 dataTime 否则插入

CREATE TABLE IF NOT EXISTS UserLastActivity 
(
    id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    loginId VARCHAR(500) NOT NULL,
    dataTime BIGINT NOT NULL,
);

第一次尝试:

MERGE INTO UserLastActivity KEY(loginId) VALUES(#loginId, #dataTime)

对于上述语句,我得到异常说明列数不匹配

第二次尝试:

MERGE INTO UserLastActivity KEY(loginId) (loginId, dataTime)
VALUES(#loginId, #dataTime)

我得到异常

原因:org.h2.jdbc.JdbcSQLException: SQL 语句中的语法错误“MERGE INTO USERLASTACTIVITY KEY(LOGINID) (LOGINID[*], DATATIME) VALUES(?, ?)”;预期 "(, SELECT, FROM"; SQL 语句:

【问题讨论】:

【参考方案1】:

两件事:

指定列名更安全,就像对任何 INSERT 所做的那样。

您需要为loginId 指定一个值,因为它已声明为NOT NULL

MERGE INTO UserLastActivity (id, loginId, dataTime) 
  KEY(loginId) 
  VALUES(10, 'user1', 1234);

【讨论】:

id 是自动递增的,我将无法传递值 如果不传递id 的值,那么MERGE 没有意义。这将成为INSERT 100% 的时间。你能澄清一下吗? 它抛出错误说参数不匹配所以我离开了合并选项并进行了更新和插入。如果更新返回 0 行然后插入

以上是关于H2数据库基于一列合并的主要内容,如果未能解决你的问题,请参考以下文章

H2(文件)删除性能

Confluence 6 H2 数据库连接与合并整合

Confluence 6 H2 数据库连接与合并整合

【Excel】多列数据合并为一列

合并其中一列或另一列中缺少数据的数据框

SQL 多行多列数据清洗合并为一行