2017-08-06 26 views
1
 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(); 

これは私のグループを追加するためのコードです。しかし、エラーは、私のクエリ構文が間違っていると言います。私は私のテーブルのfeildsとシングルコアを試しても、まだそのエラーを取得しています。まず、同じエラーを出す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 
+0

gnameとdesvarcharsの両方がテーブルにありますか? – yaswanth

+0

はい、両方ともグループテーブルのvarcharです。 – rango

答えて

4

あなたのクエリでは、あなたのコード内の改行を除去した後、これは次のようになります。つまり

insert into group(gname,des)values(?,?) 

、あなたはgroupという名前のテーブルに挿入しようとしています。 GROUPはMySQLの予約語なので、これは許可されていません。 the manualから

テーブル内の予約語のほとんどは、列または表の名前(例えば、GROUP)などの標準的なSQLによって禁止されています。

あなたは別のテーブル名(推奨)を選択するかのように、バッククォートで単語groupを囲む必要があります。

INSERT INTO `group` (gname, des) VALUES (?, ?) 

のマニュアルエントリを参照してください。

また、適切なスペースがあることを確認してください。あなたが今ある間隔の不足は、多くの文脈でさらなる問題を引き起こすでしょう。

+0

N.B. "標準* SQLで禁じられている" MySQLでは、あなたはまだこれを逆戻りすることができます... 'INSERT INTO \' GROUP \ '...'。同じページで上位になります。* 9.2項「[スキーマ・オブジェクト名](https://dev.mysql.com/doc/refman/5.7/en/identifiers)」で説明されているように、予約語は引用符で囲んで識別子として使用できます.html)。 "* –

+1

@ Michael-sqlbot公正なポイント;編集されました。 –

0

クエリーを作成するSQLの方法ではなく、Javaで適切な間隔を置いて、完全なクエリーを1行に記述できました。あなたは最初の間違いがスペーシングであることを識別できるはずです。この(修正クエリ)へ

String q = "insert into group" 
      +"(gname,des)" 
      +"values(?,?)"; 

:これは、この(あなたが使用したもの)から修正することができる

String q = "insert into group (gname, des) values(?, ?)"; 

一度作られた上記の変更、それが読みやすくなります。 @EdCottrellによって正しく指摘された次のことは、制限されたキーワードをテーブル名として使用しないことです。 DBのタイプによっては、これに関連する問題がある可能性があります。

希望すると便利です。

+1

パーサは '('と ')をトークンセパレータとして使うことができるので、スペースが足りないことは問題ではありません。 –

+0

@ MarkRotteveel、区切り記号は 'table_name(column_name1、column_name2)'のみを助けますが、この 'table_name(column_name1、column_name2)の値(column_value1、column_value2)'のようにはなりません。したがって、エラー。 –

+0

その場合、構文エラーには値リストのみが含まれ、テーブル名と列リストは含まれません。 –

関連する問題