SQL查询语法错误
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection("jdbc:mysql://localhost/exam","root","password");
String q="insert into group"
+"(gname,des)"
+"values(?,?)";
PreparedStatement p=con.prepareStatement(q);
p.setString(1,gname);
p.setString(2,des);
p.executeUpdate();
con.close();
这是我添加组的代码。但错误说我的查询语法是错误的。我已经尝试过使用表格中的单个核心,但仍然出现该错误。首先,我正在使用create语句,它也给出了相同的错误。请告诉我们这个查询有什么问题吗?SQL查询语法错误
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 'group(gname,des)values('Science','')' at line 1
sun.reflect.GeneratedConstructorAccessor16.newInstance(Unknown Source)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:423)
com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
com.mysql.jdbc.Util.getInstance(Util.java:408)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943)
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2490)
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
org.apache.jsp.groupreg_jsp._jspService(groupreg_j
您的查询,剥离出在你的代码中的换行符后,是这样的:
insert into group(gname,des)values(?,?)
换句话说,你试图插入一个名为group
表。这是不允许的,因为GROUP
是MySQL中的保留字。
大部分在表中的保留字通过标准SQL作为列或表名(例如,GROUP)禁止的。
你需要选择一个不同的表名(推荐)或环绕字group
与反引号,像这样:
INSERT INTO `group` (gname, des) VALUES (?, ?)
参见手动输入。
此外,请确保您有适当的空间;现在缺少间距会导致许多情况下出现其他问题。
N.B. “*标准* SQL禁止”。在MySQL中,你仍然可以反驳这个...'INSERT INTO \'GROUP \'...'。在同一页上更高,*如果您按第9.2节“[模式对象名称](https://dev.mysql.com/doc/refman/5.7/en/identifiers)”中所述引用它们,则允许使用保留字作为标识符.html)。“* –
@ Michael-sqlbot公平点;编辑。 –
你可以在Java中用适当的间距在单行中写完整的查询,而不用写SQL查询方式。你应该能够确定第一个错误是间距。这可以从这个被纠正(你用什么):
String q = "insert into group"
+"(gname,des)"
+"values(?,?)";
这个(修改后的查询):
String q = "insert into group (gname, des) values(?, ?)";
上述变化一旦做出,使得它的可读性。接下来的事情正如@EdCottrell所指出的,避免使用受限关键字作为表名。根据数据库类型,可能会有与此相关的问题。
希望这会有所帮助!
缺少的空格不是问题,因为解析器可以使用'('和')'作为标记分隔符。 –
@MarkRotteveel,分隔符只对'table_name(column_name1,column_name2)'有帮助,但是像这样'table_name(column_name1,column_name2)values(column_value1,column_value2)'它不会。因此错误。 –
如果是这种情况,语法错误将只包含值列表,而不包含表名和列表。 –
表中是gname和des varchars? – yaswanth
是的,它们都是组表中的varchar。 – rango