HSQLDB ПРИ синтаксической ошибке ОБНОВЛЕНИЯ ДУБЛИКАТА КЛЮЧА

#insert #sql-insert #hsqldb #upsert

#вставить #sql-вставка #hsqldb #upsert

Вопрос:

Я пытаюсь выполнить следующий запрос:

 SET DATABASE SQL SYNTAX MYS TRUE;
  

и затем:

 INSERT INTO mytable (id, age) VALUES (1, 1)
ON DUPLICATE KEY UPDATE id=2, age=33;
  

Я получаю ошибку:

 INSERT INTO mytable (id, age) VALUES (1, 1)
               ON DUPLICATE KEY
[2020-10-23 11:09:42] [42590][-5590] unexpected end of statement:  required: UPDATE : line: 2
  

В чем я ошибаюсь?

Комментарии:

1. Я почти чувствую, что, возможно, режим синтаксиса MySQL по какой-то причине не включен.

2. @Tim Biegeleisen как я могу это проверить?

3. @Tim Biegeleisen PUBLIC.PUBLIC> УСТАНОВИТЬ СИНТАКСИС SQL БАЗЫ ДАННЫХ MYS TRUE [2020-10-23 11:23:14] завершено за 4 мс PUBLIC.PUBLIC> ВСТАВИТЬ В tblUserMetadata (userMetadataId, portalId) ЗНАЧЕНИЯ (1, 1) ДЛЯ ДУБЛИРУЮЩЕГО КЛЮЧА [2020-10-23 11:23:14] [42590][-5590]неожиданный конец инструкции: требуется: ОБНОВЛЕНИЕ : строка: 2

4. Можете ли вы попробовать запустить это: SELECT 'true' WHERE 'Hello World' REGEXP '^H.*d$'; ? Давайте попробуем проверить каким-либо другим способом, что синтаксис MySQL работает.

5. @Tim Biegeleise PUBLIC.PUBLIC> ВЫБЕРИТЕ ‘true’, ГДЕ ‘Hello World’ РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ ‘ ^ H. * d$’ [2020-10-23 11:25:45] [42581][-5581] неожиданный знак: ГДЕ

Ответ №1:

OP сообщает об этом в комментарии:

 PUBLIC.PUBLIC> SET DATABASE SQL SYNTAX MYS TRUE [2020-10-23 11:23:14] completed in 4 ms 
PUBLIC.PUBLIC> INSERT INTO tblUserMetadata (userMetadataId, portalId) VALUES (1, 1) ON DUPLICATE KEY [2020-10-23 11:23:14] [42590][-5590] unexpected end of statement: required: UPDATE : line: 2
  

Строки показывают, что клиент SQL используется для запуска скрипта. Клиент SQL предварительно анализирует инструкцию и считает, что инструкция завершена после ключевого KEY слова, а ключевое UPDATE слово является началом новой инструкции. Таким образом, он пытается отправить неполный SQL-запрос в компонент database engine.

Синтаксис MySQL работает, потому что команда была принята и выполнена.

Вы можете проверить настройки свойства, выбрав из системной таблицы:

 SELECT * FROM information_schema.system_properties 
  

Приведенная ниже инструкция возвращается true , когда установлен режим совместимости с MySQL:

 SELECT property_value FROM information_schema.system_properties 
    WHERE property_name = 'sql.syntax_mys'