H2 - (相当)长插入失败并出现错误 42000

Posted

技术标签:

【中文标题】H2 - (相当)长插入失败并出现错误 42000【英文标题】:H2 - (Quite) long INSERT failing with error 42000 【发布时间】:2019-07-22 18:19:19 【问题描述】:

H2 内存中 - 插入 - 错误 42000

试用版本 1.4.196、1.4.197、1.4.199。

我也尝试在 H2 服务器(本地)上执行 INSERT:也失败了

给出错误的那一行:(抱歉,出于安全原因,我无法提供更多内容):

    INSERT INTO tb_ae (server,  record_id,  ...) 
    SELECT ... 
    FROM   vw_ofch_prepal_delta,   vw_ab_bie  
    WHERE  bie_tp IN ('S[*]') AND is_most_recent = 1;

语句长度为 4.004 个字符。

H2 将错误指出为 [*](这不是语句的一部分)。

【问题讨论】:

【参考方案1】:

H2 没有在字符串文字中设置错误标记[*]。这意味着您很可能在更早的某个地方有一个错误的' 字符。它可以是未闭合的字符串文字、某些字符串文字中未转义的' 字符(如果字符串文字包含' 字符,则应使用'' 之类的两个字符编写)或杂散的' 字符。

【讨论】:

非常感谢您的快速回答,这绝对是有帮助的 :-) 抱歉,我正在从 Excel 文件中读取 SQL 语句,并且来自那些运行良好的语句的“双引号”版本在 github.com/vorburger/MariaDB4j 中,但在 Eclipse 下存在内存泄漏,这就是我切换到 H2 的原因。然后我不得不在任何地方加上单引号,Excel 删除了单引号作为文本单元格的第一个字符,这对我来说就是这种情况。多亏了你,我查看了我的 SQL 并发现了这一点。非常感谢 ! :-)【参考方案2】:

根据 H2 错误代码文档,您的查询中存在语法错误。

/**
 * The error with code <code>42000</code> is thrown when
 * trying to execute an invalid SQL statement.
 * Example:
 * <pre>
 * CREATE ALIAS REMAINDER FOR "IEEEremainder";
 * </pre>
 */
public static final int SYNTAX_ERROR_1 = 42000;

由于您的查询太长且未完全复制。我建议再次审查查询,或者可能是其他人的审查。您应该为表名创建小别名,并为每个列名使用别名以避免语法错误。

【讨论】:

【参考方案3】:

如果您错误地编写了类似的插入内容,也会发生这种情况

insert into `my_table` (`id`, `name`)
    values (1, 'ENTITY_1'),
    values (2, 'ENTITY_2');

不小心将“值”复制粘贴两次可能并不明显。

【讨论】:

以上是关于H2 - (相当)长插入失败并出现错误 42000的主要内容,如果未能解决你的问题,请参考以下文章

具有正确 DDL sql 的 H2 org.h2.jdbc.JdbcSQLException:错误代码 = [42000-196]

与长路径一起使用时,CreateDirectory 失败并出现错误 123

markdown SQLSTATE [42000]:迁移命令时指定的键太长错误

尝试将数据插入 Atlast 服务器上的集合时,命令失败并出现错误 8000 (AtlasError)

MySQL:错误 1142 (42000) 和错误 1064 (42000)

H2 DB的Spring Boot两个Datasource配置创建表和插入数据失败