2013-09-12 4 views
0

Я пытаюсь использовать HyperSQL в моей Java-приложения следующим образом:HyperSQL - неожиданный маркер ON

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 

Что я делаю неправильно? Как решить эту проблему?

+0

@a_horse_with_no_name Но я использую синтаксис MySQL (sql.syntax_mys = TRUE), который поддерживает дублирование. Или это не полностью реализованный синтаксис MySQL? И что мне нужно использовать? Мне нужно только сделать что-то вроде REPLACE INTO. – FrozenHeart

+0

@ david99world Да. – FrozenHeart

+0

Почему, по-вашему, HSQLDB поддерживает синтаксис MySQL? Это другая СУБД и, следовательно, имеет другой синтаксис (который * * документирован в руководстве) –

ответ

2

HSQLDB не поддерживает синтаксис ON DUPLICATE (что явно документировано в руководстве).

Вы должны использовать MERGE вместо предполагая, что есть по крайней мере один столбец в вашем предложении значения, что является уникальным ключом:

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

Смежные вопросы