【问题标题】:Duplicate entry for primary key?主键重复输入?
【发布时间】:2020-02-13 04:04:03
【问题描述】:

我正在尝试在我的 JAVA 代码上更新数据库的值,但是当我尝试这样做时,它告诉我“主键的重复条目 (nameOfSomething)”;即使 PK 不存在,也会给我这个错误,我不知道为什么。欢迎所有帮助;如果需要更多代码,我很乐意添加它。提前致谢。

/**
SO THE NEW ERROR WOULD BE ON THE IF/ELSE STATEMENT, WHICH IS TRHOWING THE ELSE, THAT SAYS "DATA WAS NOT UPDATED".
*/

JButton btnUpdate = new JButton("Update");
        btnUpdate.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                String petname = txtName.getText();
                String petphoto = txtPhoto.getText();
                String pettype = txtType.getText();
                String color = txtColor.getText();
                int gender = Integer.parseInt(txtGender.getText());
                int isSterilized = Integer.parseInt(txtSterilized.getText());
                //DATE
                String pedigree = txtPedigree.getText();
                DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                String date_entry = df.format(datePicker.getDate());
                //END
                String vaccine1 = txtVaccine1.getText();
                String vaccine2 = txtVaccine2.getText();
                String vaccine3 = txtVaccine3.getText();

                Connection conn = null;
                PreparedStatement pstmt = null;

                try {
                    Class.forName("com.mysql.jdbc.Driver");
                    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/refugio","root","2797");
                    pstmt = conn.prepareStatement("UPDATE PETS SET PETPHOTO=?, PETTYPE=?, COLOR=?,GENDER=?,ISSTERILIZED=?,PEDIGREE=?,DATE_ENTRY=?,"
                            + "VACCINE1=?,VACCINE2=?,VACCINE3=? WHERE PETNAME=?"); //NEW CHANGE HERE

                    pstmt.setString(1, petname);
                    pstmt.setString(2, petphoto);
                    pstmt.setString(3, pettype);
                    pstmt.setString(4, color);
                    pstmt.setInt(5, gender);
                    pstmt.setInt(6, isSterilized);
                    pstmt.setString(7, pedigree);
                    pstmt.setString(8, date_entry);
                    pstmt.setString(9, vaccine1);
                    pstmt.setString(10, vaccine2);
                    pstmt.setString(11, vaccine3);
                    int i = pstmt.executeUpdate();

                    if(i>0) {
                        JOptionPane.showMessageDialog(null, "Data was updated");
                    }else { //NEW ERROR WOULD BE HERE
                        JOptionPane.showMessageDialog(null, "Data was not updated");
                    }
                }catch(Exception ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }

            }
        });
        btnUpdate.setBounds(48, 737, 356, 51);
        contentPane.add(btnUpdate);




/**
DATABASE DESCRIPTION:
petName     varchar(15) NO  PRI     
petPhoto    varchar(50) YES         
petType     varchar(10) NO          
color       varchar(15) YES         
gender       tinyint(1) NO          
isSterilized tinyint(1) YES         
pedigree    varchar(15) YES         
date_entry  timestamp   NO          
vaccine1    varchar(15) YES         
vaccine2    varchar(15) YES         
vaccine3    varchar(15) YES     

JUST IN CASE PK IS PETNAME. 
*/

【问题讨论】:

  • 你的桌子怎么样?
  • 您正在执行一个UPDATE 语句没有WHERE 子句,因此该语句将尝试使用相同的更新所有行价值观。看来您需要返回 SQL 指南并重新阅读教您有关 UPDATE 语句的章节。

标签: java mysql sql eclipse swing


【解决方案1】:

您的 sql 语句缺少 where 子句,因此导致您的所有 pets 都被更新为相同的值,并且其中一个值看起来是违反主键约束的主键

试着把你的sql语句改成

UPDATE PETS SET PETPHOTO=?, PETTYPE=?, COLOR=?,GENDER=?,ISSTERILIZED=?,PEDIGREE=?,DATE_ENTRY=?,VACCINE1=?,VACCINE2=?,VACCINE3=? WHERE PETNAME=?

这是假设PETNAME 是主键?否则需要做更多的工作来获取要更新的行的 ID

更新

随着您最近对 sql 的更新,您必须调整准备好的语句参数。 PETNAME 被移动到最后一个位置,因此应该是第 11 个位置,其他位置应该相应调整

pstmt.setString(11, petname);
pstmt.setString(1, petphoto);
pstmt.setString(2, pettype);
pstmt.setString(3, color);
pstmt.setInt(4, gender);
pstmt.setInt(5, isSterilized);
pstmt.setString(6, pedigree);
pstmt.setString(7, date_entry);
pstmt.setString(8, vaccine1);
pstmt.setString(9, vaccine2);
pstmt.setString(10, vaccine3);

如果你稍微改变你的查询,你可以使用命名参数而不是位置参数,那么如果你改变了命名参数的位置,你就不必重新调整位置:

例子:

"UPDATE PETS SET PETPHOTO=:PETPHOTO, PETTYPE=:PETTYPE"

pstmt.setString("PETPHOTO", petphoto);
pstmt.setString("PETTYPE", pettype);

等等……

【讨论】:

  • 所以我们取得了一些进展;现在它告诉我数据没有更新,但至少在说些什么,所以现在看看为什么它被保存了
  • 用您的新 sql 更新您的原始帖子,并让我们知道您的主键是什么以及新消息是什么。
  • 更新了帖子;如果需要更多代码,请告诉我
  • 更新了我的答案。基本上你必须重新调整你的位置参数
  • 感谢您的额外提示;当然更容易将它们作为命名参数。
【解决方案2】:

您的更新查询似乎缺少 where 条件。如果您在没有 where 条件的情况下运行更新脚本,则会为所有行更新相同的数据。

【讨论】:

    猜你喜欢
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    相关资源
    最近更新 更多