Каталог статей
1. Воспроизведите ошибку
Сегодня при отладке low-code интерфейса неожиданно сообщается следующая ошибка:
т.е. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc,name,is_deleted ) VALUES('测试哈','测试哈','测试项目',1 )' at line 11
_
Поэтому проверьте подробную информацию об ошибках, сообщаемую консолью, как показано на следующем рисунке:
java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc,name,is_deleted ) VALUES('测试哈','测试哈','测试项目',1 )' at line 1
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1348)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025)
at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeUpdate(DruidPooledPreparedStatement.java:241)
at com.test.AppModelPageService.addData(AppModelPageService.java:904)
at com.test.AppModelPageService$$FastClassBySpringCGLIB$$81597048.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at com.test.AppModelPageService$$EnhancerBySpringCGLIB$$40f27572.addData(<generated>)
at com.sugon.cloud.lowcode.controller.AppModelPageController.AddData(AppModelPageController.java:125)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197)
......
2. Ошибки анализа
Видно java.sql.SQLSyntaxErrorException
, что это SQL
грамматическая ошибка.
Найдите распечатанный SQL
журнал, как показано на следующем рисунке:
MySQL
Скопируйте оператор в красном поле в MySQL
консоль для выполнения, как показано на следующем рисунке:
Я почти уверен insert into project(remark,desc,name,is_deleted ) VALUES('测试哈','测试哈','测试项目',1 );
, что MySQL
в этом утверждении нет синтаксической ошибки.
Это может только учитывать наличие конфликтующих MySQL关键字
полей в инструкции.
Присмотритесь, desc
это MySQL
ключевое слово, которое указывает порядок убывания, как показано в следующем коде:
select * from product order by price desc;
3. Исправить ошибки
Из вышеприведенного анализа видно, что ключевые слова в insert into project(remark,desc,name,is_deleted ) VALUES('测试哈','测试哈','测试项目',1 );
моем desc
операторе SQL конфликтуют.MySQL
desc
Поэтому я могу изменить его двумя способами:
- метод первый
Измените мое desc
поле на другие MySQL
поля, которые не конфликтуют с ключевыми словами, например note
и т. д.
- Способ второй
Добавьте обратные кавычки (`) к MySQL
оператору выше , как показано в следующем коде:desc
mysql> insert into project(remark,`desc`,name,is_deleted ) VALUES('测试哈','测试哈','测试项目',1 );
Query OK, 1 row affected (0.01 sec)
Поэтому в нашей фактической разработке лучше всего добавлять обратные кавычки (`) к таким полям, как добавление, изменение и запрос.
Избегайте MySQL
конфликтов ключевых слов с вашими собственными, тем самым уменьшая ненужные проблемы.
4. Другие способы устранения этой ошибки
Моя ошибка в том, что в insert
операторе есть MySQL
поле, которое конфликтует с ключевым словом, и проблему можно решить, добавив обратно одинарные кавычки в конфликтующее поле.
Если ваша ошибка не вызвана этой причиной, вы можете обратиться к следующим решениям.
- Одинарные кавычки и обратные одинарные кавычки неразличимы
java
Одинарные кавычки (') используются для значений ключей, а одинарные кавычки (`) используются для имен столбцов, например
ed.insertData("insert into information(`nowtime`,`data`) values(current_time,'A');");
insertData
Он отвечает за выполнение этого SQL
оператора, и он, наконец, возвращает количество затронутых элементов, так что не беспокойтесь об этом.
в:
-
Имена столбцов
nowtime
иdata
(здесь используйте обратные одинарные кавычки) -
Значение, записанное в базу данных, представляет собой
current_time
символ амперсандаA
(здесь одинарные кавычки).
- Проверьте, является ли true синтаксической ошибкой
Обычно это можно увидеть.
- Проверьте, не забывает ли оператор пробелы
Сообщается о следующей ошибке:
int result = ed.insertData("insert "+"into test"
+ "values(1) ");
Несложно объединить код в одно предложение и выполнить его, как показано ниже:
int result = ed.insertData("insert into test values(1) ");
Между первым предложением test
и последующим нет пробела values
, поэтому, естественно, будет сообщено об ошибке.
Читатели должны обратить внимание, не забыли ли вы еще и пробел, эта ошибка часто возникает при смене строк.
SQL
Поэтому лучше писать короткие предложения одним предложением, чтобы снизить bug
эффективность производства.