2017-08-06 5 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(); 

Dies ist mein Code zum Hinzufügen einer Gruppe. Aber der Fehler sagt, dass meine Abfragesyntax falsch ist. Ich habe einzelne Kerne mit den Feilds in meiner Tabelle versucht, aber immer noch diesen Fehler bekommen. Erstens habe ich create-Anweisung verwendet, die auch den gleichen Fehler ergab. Bitte sagen Sie uns, was wir falsch mit dieser Abfrage?SQL-Abfragesyntax ist falsch

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

Sind sowohl gname als auch deservarchs in der Tabelle? – yaswanth

+0

Ja, beide sind Varchar in der Gruppentabelle. – rango

Antwort

4

Ihre Anfrage, nachdem die Zeilenumbrüche im Code Strippen, ist dies:

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

Mit anderen Worten: Sie versuchen, in eine Tabelle group Namen einzufügen. Dies ist nicht zulässig, da GROUP ein reserviertes Wort in MySQL ist.

Von the manual:

Die meisten der reservierten Wörter in der Tabelle mit Standard-SQL als Spalte oder Tabellennamen verboten sind (zB GROUP).

Sie müssen einen anderen Tabellennamen (empfohlen) holen oder das Wort group mit Backticks umgeben, wie folgt aus:

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

die manuelle Eingabe Siehe auf .

Stellen Sie außerdem sicher, dass Sie über geeignete Leerzeichen verfügen. Das Fehlen von Abständen, die Sie jetzt haben, wird in vielen Kontexten zusätzliche Probleme verursachen.

+0

N.B. "verboten durch * Standard * SQL." In MySQL können Sie dies immer noch rückgängig machen ... 'INSERT INTO \' GROUP \ '...'. Weiter oben auf der gleichen Seite, * Reservierte Wörter sind als Bezeichner zulässig, wenn Sie sie wie in Abschnitt 9.2, "[Schemaobjektnamen]" (https://dev.mysql.com/doc/refman/5.7/en/identifiers) beschrieben, zitieren .html). "* –

+1

@ Michael-sqlbot-Messepunkt; bearbeitet. –

0

Sie könnten die vollständige Abfrage in einer einzigen Zeile mit dem richtigen Abstand in Java geschrieben haben, anstatt die SQL-Methode zum Schreiben von Abfragen zu verwenden. Sie sollten in der Lage sein zu erkennen, dass der erste Fehler im Abstand liegt. Dies kann von dieser korrigiert werden (was Sie verwendet haben):

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

dazu (die geänderte Abfrage):

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

Die obige Änderung einmal gemacht, es lesbar macht. Die nächste Sache, auf die @ EdCottrell zu Recht hingewiesen hat, ist die Verwendung eingeschränkter Schlüsselwörter als Tabellennamen. Je nach DB-Typ können Probleme damit verbunden sein.

Hoffe, das hilft!

+1

Die fehlenden Leerzeichen sind kein Problem, da der Parser die '(' und ')' als Token-Trennzeichen verwenden kann. –

+0

@MarkRotteveel, Separatoren helfen mit dem 'table_name (column_name1, column_name2)' nur, aber wie dieser 'table_name (column_name1, column_name2) -Werte (column_value1, column_value2)' wird es nicht. Daher der Fehler. –

+0

Wenn dies der Fall wäre, würde der Syntaxfehler nur die Werteliste und nicht den Tabellennamen und die Spaltenliste enthalten. –