Повторяющаяся запись для первичного ключа? - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь ОБНОВИТЬ значения базы данных в моем коде JAVA, но когда я пытаюсь это сделать, он говорит мне «Дублирующая запись (nameOfSomething) для первичного ключа»;даже если ПК не существует, выдает мне эту ошибку, и я не знаю, почему. Вся помощь приветствуется;если понадобится больше кода, я с удовольствием его добавлю. Заранее спасибо.

/**
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. 
*/

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

В вашем выражении sql отсутствует предложение where, поэтому все ваши pets обновляются до всех одинаковых значений, и одно из этих значений выглядит как первичный ключ, который нарушает ограничение первичного ключа

Попробуйте изменить выражение SQL на

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

. Это предполагает, что PETNAME является первичным ключом? В противном случае потребуется еще проделать определенную работу, чтобы получить идентификатор строки, которую вы хотите обновить

Обновление

После недавнего обновления вашего 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);

И т.д. ...

0 голосов
/ 16 октября 2019

Похоже, ваш запрос на обновление отсутствует, где условие. Если вы запустите сценарий обновления без условия, одни и те же данные будут обновлены для всех строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...