Java com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 重复条目 '' 键 'PRIMARY'

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22926420/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 19:04:33  来源:igfitidea点击:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '' for key 'PRIMARY'

javamysqlsqlexceptionjdbc

提问by TomJ

I am getting this exception from today onwards. Yesterday things were fine. I will post my code :

从今天开始,我收到了这个例外。昨天一切正常。我会发布我的代码:

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) {

    }
}

I am trying to create a table with only one column and that column is the primary key. When the code is run for the first time the table is getting created. But value is not getting entered. No exception is shown then. But when I try to enter value for the second time, the exception comes up.

我正在尝试创建一个只有一列的表,该列是主键。当代码第一次运行时,表被创建。但是没有输入值。然后没有异常显示。但是当我第二次尝试输入值时,出现异常。

How can I correct this ? If anyone needs to see some more code I will post it.

我该如何纠正?如果有人需要查看更多代码,我会发布它。

This is the code through which the user enters the data :

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

    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<ActionEvent>() {
        @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);
            }
        }
    });

The exception details is :

异常详情是:

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.handle(AddStaff.java:100)
at addstaff.AddStaff.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.handle(SkinBase.java:336)
at com.sun.javafx.scene.control.skin.SkinBase.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.access00(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.access0(WinApplication.java:17)
at com.sun.glass.ui.win.WinApplication.run(WinApplication.java:67)
at java.lang.Thread.run(Thread.java:744)

回答by jmail

you shoud removethe ;in your sql query:

您768,16remove;在您的SQL查询:

wrong query:

错误查询:

prepareStatement("create table staff (staffname varchar(30) primary key);");

preparedStatement = connect.prepareStatement("insert into staff values(?);");

correct query is:

正确的查询是:

prepareStatement("create table staff (staffname varchar(30) primary key)");

preparedStatement = connect.prepareStatement("insert into staff values(?)");

CHECK YOUR INSERT QUERY

检查您的插入查询

And, I think your INSERTthe values in the db, that query is too wrong, did mention the tablenameonly, you should not mention the columnname. so you should must add the tablename with your query.

而且,我认为您的INSERTthe values in the db,那个查询太错误了,只提到了tablename,你不应该提到columnname。所以你必须在你的查询中添加表名。

wrong query:

错误查询:

insert into staff values(?)

correct query:

正确查询:

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


refer this link:

参考这个链接:

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

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

UPDATE:1

更新:1

wrong code:

错误代码:

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();

you should change like:sample

你应该像这样改变:sample

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

Note:

笔记:

  1. you should not call the sql query.
  2. And, you are using preparedStatementto call, you should must chage to statement
  3. the preparedStatementis can't resolved.
  1. 你不应该调用 sql 查询。
  2. 而且,你preparedStatement习惯打电话,你应该改变statement
  3. preparedStatementIS不能得到解决。

like,

喜欢,

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

update:2:-->sample

更新: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);
    }
}

回答by Ithar

A possible cause for this error is that you are trying to enter the same value on a primary key filed into a table.

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

For example if you have a table userswhere the primary key is user_idand you try to entry the following:

例如,如果您有一个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);

A MySQLIntegrityConstraintViolationException: Duplicate entryerror will arise.

一个MySQLIntegrityConstraintViolationException: Duplicate entry会出现错误。

Note: there could be certain valid cases where one needs to insert or update a column in the a table and in such cases one can use ON DUPLICATE KEY UPDATE.

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

Example:

例子:

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