com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:为键’PRIMARY’复制条目”

我从今天起就得到了这个例外。 昨天事情很好。 我会发布我的代码:

public void enterStaff() throws ClassNotFoundException, SQLException { try { Class.forName("com.mysql.jdbc.Driver"); connect = DriverManager .getConnection("jdbc:mysql://localhost:3306/project?" + "user=root&password=virus"); statement = connect.createStatement(); preparedStatement = connect .prepareStatement("SELECT count(*)FROM information_schema.tables\n" + "WHERE table_schema = 'project' AND table_name = 'staff'"); rs = preparedStatement.executeQuery(); rs.next(); int chk = rs.getInt(1); if (chk != 1) { preparedStatement = connect .prepareStatement("create table staff (staffname varchar(30) primary key);"); preparedStatement.executeUpdate(); } preparedStatement = connect .prepareStatement("insert into staff values(?);"); preparedStatement.setString(1, addSubName.getText()); preparedStatement.executeUpdate(); } catch (ClassNotFoundException | SQLException e) { throw e; } finally { close2(); } } private void close2() { try { if (statement != null) { statement.close(); } if (connect != null) { connect.close(); } } catch (SQLException e) { } } 

我正在尝试创建一个只有一列的表,该列是主键。 当代码第一次运行时,表格就会被创建。 但价值没有进入。 当时没有例外。 但是当我第二次尝试输入值时,会出现exception。

我怎么能纠正这个? 如果有人需要查看更多代码,我会发布它。

这是用户输入数据的代码:

  addSubName = new TextField(); addSubName.setPromptText("Staff Name"); addSubName.setPrefSize(200, 30); final Button b2 = new Button("Add"); b2.setFont(Font.font("Calibri", FontWeight.BOLD, 17)); b2.setPrefSize(70, 30); b2.setStyle(" -fx-base: #0066ff;"); b2.setTextFill(Color.BLACK); b2.setOnAction(new EventHandler() { @Override public void handle(ActionEvent e) { data.add(new Staff(addSubName.getText())); addSubName.clear(); try { enterStaff(); } catch (ClassNotFoundException ex) { Logger.getLogger(AddStaff.class.getName()).log(Level.SEVERE, null, ex); } catch (SQLException ex) { Logger.getLogger(AddStaff.class.getName()).log(Level.SEVERE, null, ex); } } }); 

例外细节是:

 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '' for key 'PRIMARY' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 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:1040) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) at addstaff.AddStaff.enterStaff(AddStaff.java:149) at addstaff.AddStaff$2.handle(AddStaff.java:100) at addstaff.AddStaff$2.handle(AddStaff.java:92) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170) at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53) at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28) at javafx.event.Event.fireEvent(Event.java:171) at javafx.scene.Node.fireEvent(Node.java:6867) at javafx.scene.control.Button.fire(Button.java:179) at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:193) at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:336) at com.sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.java:329) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:64) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170) at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53) at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33) at javafx.event.Event.fireEvent(Event.java:171) at javafx.scene.Scene$MouseHandler.process(Scene.java:3311) at javafx.scene.Scene$MouseHandler.process(Scene.java:3151) at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3106) at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1563) at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2248) at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:250) at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:173) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:292) at com.sun.glass.ui.View.handleMouseEvent(View.java:530) at com.sun.glass.ui.View.notifyMouse(View.java:924) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:17) at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:67) at java.lang.Thread.run(Thread.java:744) 

你应该remove ; 在你的SQL查询中:

错误查询:

 prepareStatement("create table staff (staffname varchar(30) primary key);"); preparedStatement = connect.prepareStatement("insert into staff values(?);"); 

正确的查询是:

 prepareStatement("create table staff (staffname varchar(30) primary key)"); preparedStatement = connect.prepareStatement("insert into staff values(?)"); 

检查你的插入查询

并且,我认为你的INSERT值在db中,该查询错误,只提到了表名 ,你不应该提到列名 所以你应该在你的查询中添加tablename。

错误查询:

 insert into staff values(?) 

正确查询:

  INSERT INTO table_name VALUES (value1,value2,value3,...); 

参考此链接:

http://www.w3schools.com/sql/sql_insert.asp

更新:1

错误的代码:

 statement = connect.createStatement(); preparedStatement = connect .prepareStatement("SELECT count(*)FROM information_schema.tables\n" + "WHERE table_schema = 'project' AND table_name = 'staff'"); rs = preparedStatement.executeQuery(); rs.next(); 

你应该改变:样品

 Class.forName(driverName).newInstance(); con=DriverManager.getConnection(connectionUrl+dbName,user,password); st = con.createStatement(); String sql="SELECT * FROM employees"; rs=st.executeQuery(sql); 

注意:

  1. 你不应该调用sql查询。
  2. 并且,您正在使用preparedStatement来调用,您应该使用chage to statement
  3. preparedStatement无法解决。

喜欢,

 string sql=....sql query...; statement.executeQuery(sql) 

更新:2: – >样品

 public class User { private String empname; public String getEmpName() { return empname; } public void setEmpName(String empname) { this.empname=empname; } 

 public void addUser(User user) { try { PreparedStatement ps; ps=connection.prepareStatement("INSERT INTO employee (empname,empaddress,depname) VALUES (?,?,?)"); ps.setString(1, user.getEmpName()); ps.setString(2, user.getEmpAddress()); ps.setString(3, user.getDepName()); ps.executeUpdate(); } catch(Exception e) { System.out.println(e); } } 

导致此错误的一个可能原因是您尝试在归档到表中的主键上输入相同的值。

例如,如果您有一个表users ,其中主键是user_id并且您尝试输入以下内容:

 INSERT INTO users ('user_id', 'name', 'age') VALUES (112233, 'Tom', 18); INSERT INTO users ('user_id', 'name', 'age') VALUES (112233, 'Barry', 21); 

MySQLIntegrityConstraintViolationException: Duplicate entry将出现MySQLIntegrityConstraintViolationException: Duplicate entry错误。

注意:可能存在某些有效情况,其中需要插入或更新表中的列,在这种情况下,可以使用ON DUPLICATE KEY UPDATE

例:

 INSERT INTO social_link ('user_id', 'social_id') VALUES (112233, 59874) ON DUPLICATE KEY UPDATE social_id=575123;