【问题标题】:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException CREATE TABLEcom.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException CREATE TABLE
【发布时间】:2016-07-07 02:02:31
【问题描述】:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误

我有一个create_table(String table_name) 函数。似乎有一个我无法弄清楚的 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 '1006 (Date VARCHAR(10) NOT NULL, Weight FLOAT NOT NULL, Amount FLOAT NOT NULL, P' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
at com.mysql.jdbc.Util.getInstance(Util.java:387)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:939)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2547)
at com.mysql.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1541)
at com.mysql.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2605)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1469)
at com.appsmith.card_io.IOstream.create_table(IOstream.java:249)
at com.appsmith.card_io.IOstream$1.actionPerformed(IOstream.java:110)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:703)
at java.awt.EventQueue.access$000(EventQueue.java:102)
at java.awt.EventQueue$3.run(EventQueue.java:662)
at java.awt.EventQueue$3.run(EventQueue.java:660)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:676)
at java.awt.EventQueue$4.run(EventQueue.java:674)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:673)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97) 

建表功能:

public void create_table(String table_name) {
    StringBuilder sql = new StringBuilder();
    sql.append(String.format("CREATE TABLE %s ", table_name));
    sql.append("(Date VARCHAR(10) NOT NULL, ");
    sql.append("Weight FLOAT NOT NULL, ");
    sql.append("Amount FLOAT NOT NULL, ");
    sql.append("PRIMARY KEY (Date))");
    Statement stmt = null;
    try {
        stmt = conn.createStatement();
        stmt.executeUpdate(sql.toString()); //IOstream.java:249
    } catch (SQLException e) {          
        e.printStackTrace();
    }
}

【问题讨论】:

  • Date可能是android中的保留关键字,尝试更改为Date_并检查一次..
  • @ELITE 仍然出现错误
  • 表名是什么??检查答案。
  • 你的表名是1006?这不是一个有效的表名。

标签: java mysql jdbc create-table


【解决方案1】:

来自docs

标识符可以以数字开头,但除非被引用,否则标识符可能不完全由数字组成。

因此,要么引用表名,要么将其重命名为包含一个字母

sql.append(String.format("CREATE TABLE `%s` ", table_name));

【讨论】:

  • 感谢@Reimeus 的快速回复。这对我有用。我将我的表命名为 ID。将其替换为“T”+ ID 即可解决。
  • 是的,最好避免仅使用数字并使用可理解的表名(字母/单词.....):)
  • 有一个带有 ID 的表名,听起来你在滥用表来为每个“父记录”创建一个表,而不是使用外键约束或类似的东西。
猜你喜欢
  • 2012-04-20
  • 2013-11-20
  • 2015-01-22
  • 2018-04-26
  • 2012-07-20
  • 2011-12-15
  • 1970-01-01
  • 2016-04-16
  • 2016-08-23
相关资源
最近更新 更多