【问题标题】:Getting an error in update statement when accessing mysql from java从java访问mysql时更新语句出错
【发布时间】:2012-04-03 20:44:33
【问题描述】:
String sql = "update `library`.`memebers` set 'STATUS'='" + "1" +"' where mem_id = '"+str+"'";

int i = st.executeUpdate(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 ''status' = '1' where mem_id = '656597'' at line 1
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
        at com.mysql.jdbc.Util.getInstance(Util.java:386)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2618)
        at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1749)
        at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1666)
        at Frames.Addmembers.jButton1ActionPerformed(Addmembers.java:181)
        at Frames.Addmembers.access$000(Addmembers.java:21)
        at Frames.Addmembers$1.actionPerformed(Addmembers.java:83)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

【问题讨论】:

  • 这是一个 SQL 问题。我 99.9% 确信这与 Java 无关。您应该使用您发送到 mysql 的实际查询进行打印
  • 您确定使用:library.memebers 而不是 library.members

标签: mysql sql database jdbc


【解决方案1】:

单引号中的字段名称。它应该不带引号,或者在后面的单引号内:```:

String sql = "update library.memebers set `STATUS`='1' where mem_id = '"+str+"'";

【讨论】:

  • 即使进行了上述更正,我也没有收到任何错误。但是数据库仍然没有更新。
【解决方案2】:

status 是列的名称,因此,它应该是 status`status`

实体要么写成普通的,要么用 `` 引用。 (反引号,不是撇号。)

除非您为列名使用保留字段名称(您不应该这样做),否则您不必引用字段。

String sql = "update library.memebers set STATUS = 1 where mem_id = " + Integer.valueOf(str);

请注意,我删除了状态和 mem_id 周围的引号。我假设两者都是整数字段,如果是,则不应引用它们的值。整数字段应该有整数值,而不是计算为整数值的字符串。 (请注意,尽管您永远不会盲目地假设一个字符串是一个整数并将其连接到一个查询中——始终首先确保它是一个正确的整数)

【讨论】:

  • 即使进行了上述更正,我也没有收到任何错误。但是数据库仍然没有更新。
  • @Manish 我会确保 mem_id 与表中的某些内容匹配。正如有人在评论中建议的那样,您可能想要回显 SQL 并尝试手动运行它。
  • 你能帮我解决这个问题吗? String sql = "insert into library.books values("+bid+","+bname+","+publisher+","+author+","+Integer. parseInt(price)+","+rack_no+","+Date.valueOf(dop)+","+username; try { int i = st.executeUpdate(sql); if(i == 1) JOptionPane.showMessageDialog( null,"已添加图书" ,"SUCESS",JOptionPane.PLAIN_MESSAGE); else JOptionPane.showMessageDialog(null,"添加图书时出现问题","ERROR",JOptionPane.ERROR_MESSAGE); } catch(Exception ex) { ex. printStackTrace(); }
  • @Manish 如果打印出sql的值,它会说什么?
  • Corbin 先生非常感谢您的帮助和关心。我昨天自己整理了一下。如果您允许,我将来也可以寻求您的帮助。
猜你喜欢
  • 1970-01-01
  • 2016-09-03
  • 2011-05-03
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多