Неопределенная синтаксическая ошибка в SQL-запросе в Maria-DB

#sql #mariadb

#sql #mariadb

Вопрос:

 INSERT INTO "order" SET `user_id` = 5, `week_id` = 1, `box_settings_id` = '1', `delivery_day` = 'Thursday', `delivery_time` = 'Morning 6am - 9am', `notes` = '', `recipes` = '70, 71, 72, 74';
  

Что не так с моим SQL-запросом? Я получаю эту ошибку в phpMyAdmin:

 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"order" SET `user_id` = 5, `week_id` = 1, `box_settings_id` = '1', `delivery_day' at line 1
  

Пока отладчик SQL не показывает никакой ошибки.

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

1. @forpas хорошо, итак, я использую это INSERT INTO person SET first_name = 'John', last_name = 'Doe'; , я делаю что-нибудь неправильно?

2. forpas предположил, что вы ошибочно смешали синтаксис insert и update. Я также никогда не видел такого нестандартного синтаксиса, который вы используете. Мне пришлось посмотреть это, что, очевидно, сделал и forpas 🙂

3. @ThorstenKettner форпас — подлый человек, которого я полностью проигнорировал после его последнего комментария, и в итоге он удалил sigh . Люди здесь излишне придирчивы. 🙁

4. Иногда мы ошибаемся. Когда я увидел ваш запрос, я был абсолютно уверен, что ваш синтаксис был неправильным. А затем я увидел, что forpa удалили свой комментарий, что заставило меня посмотреть этот синтаксис. Да, было бы намного лучше, если бы они сказали «Извините, я ошибся». Я согласен. однако forpas написал много хороших ответов и помог множеству людей. Иногда с простыми комментариями. И иногда мы звучим немного грубо, но мы действительно здесь, чтобы помочь.

5. @ThorstenKettner Я, честно говоря, не возражаю, слова лично мне никогда не вредят, я просто возражаю против тех, кто быстро переходит к «-1». Все хорошо. 🙂

Ответ №1:

Проблема, вероятно, связана с использованием двойных кавычек, которые MySQL и MariaDB расходятся со стандартом ANSI SQL. Вместо двойных кавычек (синонимичных одинарным кавычкам для строковых литералов) MariaDB и MySQL использовали бы обратные метки. С учетом сказанного, вы можете настроить режим SQL на не стандартный ANSI или ANSI_QUOTES для поддержки двойных кавычек для идентификаторов:

ANSI_QUOTES
Изменения " должны обрабатываться как `, символ кавычки идентификатора. Это может привести к поломке старых приложений MariaDB, которые предполагают, что «используется в качестве символа строковой кавычки.

Поэтому просто используйте обратные метки в order таблице, как вы делаете для столбцов. Как правило, любой идентификатор может использовать обратные ссылки.

 INSERT INTO `order` 
SET `user_id` = 5, 
    `week_id` = 1, 
    `box_settings_id` = '1', 
    `delivery_day` = 'Thursday', 
    `delivery_time` = 'Morning 6am - 9am', 
    `notes` = '', 
    `recipes` = '70, 71, 72, 74';
  

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

1. Или, что еще лучше, вообще удалите двойные кавычки и обратные знаки. Они здесь не нужны. 😉

2. Я не знал об этом. Я использую это в node.js Я изучу, как я могу избежать обратных ссылок. Большое вам спасибо.

3. @ThorstenKettner, order это зарезервированное слово в MariaDB .

4. @ThorstenKettner Они каким-то образом есть, «порядок» — это зарезервированное ключевое слово.