HyperSQL - 意外令牌开启

Posted

技术标签:

【中文标题】HyperSQL - 意外令牌开启【英文标题】:HyperSQL - unexpected token ON 【发布时间】:2013-09-12 09:29:14 【问题描述】:

我正在尝试通过以下方式在我的 Java 应用程序中使用 HyperSQL:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class Main 

    static Connection conn;
    static Statement stat;

    public static void main(String[] args) 

        try 
            Class.forName("org.hsqldb.jdbc.JDBCDriver" );
         catch (Exception ex) 
            System.out.println("An error occurred while loading HSQLDB JDBC driver: " + ex.getMessage());
            return;
        

        try 

            conn = DriverManager.getConnection(
                    "jdbc:hsqldb:file:helper_db;sql.syntax_mys=true");

            stat = conn.createStatement();

            stat.executeUpdate(
                "CREATE TABLE IF NOT EXISTS some_table " +
                     "(" +
                        "foo TEXT PRIMARY KEY, " +
                        "bar TEXT" +
                    ");"
            );

            stat.executeUpdate(
                "INSERT INTO some_table VALUES" +
                        "('foo', 'bar') " +
                        "ON DUPLICATE KEY UPDATE some_table = VALUES" +
                        "('foo', 'bar');"
            );

         catch (Exception ex) 

            System.out.println("An error occurred: " + ex.getMessage());
            return;

        

    

这段代码给了我以下输出:

An error occurred: unexpected token: ON

我做错了什么?如何解决这个问题?

【问题讨论】:

@a_horse_with_no_name 但我使用的是支持 ON DUPLICATE 的 mysql 语法 (sql.syntax_mys=true)。或者它不是完全实现的 MySQL 语法?我需要使用什么?我只需要像 REPLACE INTO 那样做。 为什么你认为 HSQLDB 支持 MySQL 语法?它是不同的 DBMS,因此具有不同的语法( 记录在手册中) @a_horse_with_no_name 我认为 sql.syntax_mys=true 做到了,不是吗? 您是否阅读了有关其作用的说明? hsqldb.org/doc/2.0/guide/management-chapt.html#N14C22 @a_horse_with_no_name 对不起,谢谢 【参考方案1】:

HSQLDB 不支持ON DUPLICATE 语法(手册中有明确的说明)。

您需要使用 MERGE 来代替,假设您的 values 子句中至少有一列是唯一键:

MERGE INTO some_table ut
USING (
  VALUES
    ('foo', 'bar')
) AS md (foo_column, bar_column) ON (ut.foo_column = md.foo_column)
WHEN MATCHED THEN UPDATE
     SET ut.bar_column = md.bar_column
WHEN NOT MATCHED THEN
  INSERT (foo_column, bar_column)
  VALUES (md.foo_column, md.bar_column);

更多详情请查看手册:http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_merge_statement

【讨论】:

【参考方案2】:

HSQL 的更新版本现在支持 MySQL 的ON DUPLICATE KEY UPDATE 功能。

参考:http://hsqldb.org/doc/guide/guide.html#coc_compatibility_mysql

【讨论】:

以上是关于HyperSQL - 意外令牌开启的主要内容,如果未能解决你的问题,请参考以下文章

休眠错误消息:意外令牌:NULLS(脚本文件行中的错误:13 意外令牌:NULLS)

reactjs意外的令牌'<'

Reactjs:意外的令牌'<'错误

笑话:意外的令牌@Decorator

意外的令牌 语法错误

位置 4 处的意外令牌左括号()