在java/mysql应用程序中,sql更新可以表现为sql插入吗

在java/mysql应用程序中,sql更新可以表现为sql插入吗,java,mysql,Java,Mysql,在一个数据库应用程序中,在测试某个代表数据库表内容的应用程序jtable的更新按钮语句时,我得到了一个结果行为,即创建一个新行/记录或抛出一个重复的主键异常,例如相同的行/记录键,具有清晰的更新语句和语法,实际上,我之前在这里问过,我被引导提供了一个“最小、完整和可验证的示例”,所以我在一个新的java runnable类中获取了这些更新行—它工作得非常好,我没有注意到差异—就是这样一个对应的参数代码示例: import java.sql.*; import java.util.logging.

在一个数据库应用程序中,在测试某个代表数据库表内容的应用程序jtable的更新按钮语句时,我得到了一个结果行为,即创建一个新行/记录或抛出一个重复的主键异常,例如相同的行/记录键,具有清晰的更新语句和语法,实际上,我之前在这里问过,我被引导提供了一个“最小、完整和可验证的示例”,所以我在一个新的java runnable类中获取了这些更新行—它工作得非常好,我没有注意到差异—就是这样一个对应的参数代码示例:

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;


public class QueryTesting
{

  public static void main(String[] args)
  {
    try
    {
            // create a java mysql database connection
            Class.forName("com.mysql.jdbc.Driver");
            try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/?verifyServerCertificate=false&useSSL=true", "username", "password")) {
                Statement s = null ;
                try {
                    s = conn.createStatement();
                } catch (SQLException ex) {
                    Logger.getLogger(QueryTestingForWMC.class.getName()).log(Level.SEVERE, null, ex);
                }
                int Result ;
                try {
                    Result = s.executeUpdate("USE myDatabase");
                } catch (SQLException ex) {
                    Logger.getLogger(QueryTestingForWMC.class.getName()).log(Level.SEVERE, null, ex);
                }
                PreparedStatement preparedStmt= null;
                // create the java mysql update preparedstatement
                String query = "update relativesTable set idRelativeMembers = ? , Name = ? , Picture = ? , RelationDegree = ? , persons_idPersons = ? where idRelativeMembers = ?";
                // create the mysql update preparedstatement
                preparedStmt = conn.prepareStatement(query);
                preparedStmt.setString(1,"00002/10");
                preparedStmt.setString(2,"عبد الحفيظ أحمد عبد الفتاح الدؤري");
                preparedStmt.setBinaryStream(3, null);
                preparedStmt.setString(4, "إبن عم");
                preparedStmt.setString(5, "00002");
                preparedStmt.setString(6, "00002/10");

                // execute the java preparedstatement
                preparedStmt.executeUpdate();
                preparedStmt.close();
                s.close();
            }
            catch (Exception e)
            {
                System.err.println("Got an exception! ");
                System.err.println(e.getMessage());
            }
    }catch (ClassNotFoundException e)
    {
        System.err.println("Got an exception! ");
        System.err.println(e.getMessage());
    }              

  }
}
原始应用程序中的update代码块使用System.out.println()提示语句提及,以确保是updating语句条件块:

// the mysql update statement
String selectedMemberPrimaryKey = getMembersWithoutPhotos().get(jTable5.convertRowIndexToView(jTable5.getSelectedRow())).getId() ;

System.out.println("This is an update query");

String updateStatement = "update relativesTable set idRelativeMembers = ? , Name = ? , Picture = ? , RelationDegree = ? , persons_idPersons = ? where idRelativeMembers = ?";

// create the mysql update preparedstatement
preparedStmt = conn.prepareStatement(updateStatement);
preparedStmt.setString(1, jTextField2.getText());
插入条件也会提示插入提示:

// the mysql insert statement
System.out.println("This is an insert query");

String insertStatement = "insert into relativesTable (idRelativeMembers, Name, Picture, RelationDegree, persons_idPersons) values ( ?, ?, ?, ?, ?)";


// create the mysql insert preparedstatement
preparedStmt = conn.prepareStatement(insertStatement);
preparedStmt.setString(1, jTextField2.getText());
数据库表通过persons_idPersons外键与另一个表关联,到目前为止,我还不知道该行为是如何产生的,但是,是否存在可能导致jdbc sql update语句插入行为的条件


新概念:

我已尝试通过其他prepare语句方式准备更新查询,例如:

   System.out.println("This is an update query");
   String updateStatement = "update relativesTable set idRelativeMembers = '00002/20' , Name =' أحمد عبد البارئ الثبنيتي ', Picture = null , RelationDegree =' عم ', persons_idPersons = '00002' where idRelativeMembers = '00002/10'";                       

   // create the mysql update preparedstatement
   preparedStmt = conn.prepareStatement(updateStatement);
而且效果非常好


jbutton中用于将数据保存到数据库的整个UPDATE语句块是-虽然我在jbutton中对整个INSERT语句块进行了注释,但UPDATE仍然可以在这种INSERT行为中工作!-:

    try
    {
        // the mysql update statement
        String selectedRelateivesMemberPrimaryKey = getMembersWithoutPhotos().get(jTable5.convertRowIndexToView(jTable5.getSelectedRow())).getId() ;

        System.out.println("This is an update query");
        String updateStatement = "update relativesTable set idRelativeMembers = ? , Name = ? , Picture = ? , RelationDegree = ? , persons_idPersons = ? where idRelativeMembers = ?";                       

        // create the mysql update preparedstatement
        preparedStmt = conn.prepareStatement(updateStatement);
        preparedStmt.setString(1, jTextField2.getText());
        selectedRelativeMemberForUpdateId = jTextField2.getText();
        preparedStmt.setString(2, jTextField4.getText());

        if(null == jLabel17.getIcon())
        {

            preparedStmt.setBinaryStream(3, null);

        }else
        {

            Icon icon = jLabel17.getIcon();
            ImageIcon img = (ImageIcon) icon ;
            BufferedImage bI = new BufferedImage(img.getIconWidth(), img.getIconHeight(), BufferedImage.TYPE_INT_RGB);
            Graphics g = bI.createGraphics();
            icon.paintIcon(null, g, 0,0);
            g.dispose();
            ImageIO.write(bI, "jpg", new File("personRelativeMemTempImage.jpg"));
            personRelativeMemImageFileForDatabase = new File("personRelativeMemTempImage.jpg");
            personRelativeMemImageFileInputStream = new FileInputStream(personRelativeMemImageFileForDatabase);
            preparedStmt.setBinaryStream(3,(InputStream) personRelativeMemImageFileInputStream,(int) personRelativeMemImageFileForDatabase.length());

        }

        preparedStmt.setString(4, jTextField15.getText());
        preparedStmt.setString(5, selectedPersonForRelativeMembersId);


        preparedStmt.setString(6, selectedRelateivesMemberPrimaryKey);



        // execute the preparedstatement
        preparedStmt.execute();

        try {
            preparedStmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
        }                        

    }
    catch (FileNotFoundException | SQLException e)
    {
        System.err.println("Got an exception!");
        System.err.println(e.getMessage());
        String exceptionMessage = e.getMessage();
        if(exceptionMessage.contains(exceptionStringPartOne) && exceptionMessage.contains(exceptionStringPartTwo))
        {                
            JOptionPane.showMessageDialog(null, "Duplicate Keys","error",JOptionPane.ERROR_MESSAGE);
            duplicatePrimaryKeyFlag = true ;
        }else
        {
            JOptionPane.showMessageDialog(null, "A Related Database Error","error",JOptionPane.ERROR_MESSAGE);
            return;
        }

    } catch (IOException ex) {
        Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);

    }

不,您需要一个INSERT语句来插入新行,更新将只作用于现有记录

表上可能定义了执行插入的前/后更新触发器,但它仍然是创建新记录的插入,不管调用它的方式如何

你可以用它来检查触发器

select * from `information_schema`.`triggers` 
where event_object_schema = 'myDatabase' 
and event_object_table = 'relativesTable'\G
但是,更可能的解释是运行插入路径而不是更新路径的应用程序逻辑中存在错误,或者两者都存在

序言:

申请表向个人的jtable提供选择,然后从亲戚jtable向其亲属成员提供其他选择,另一个选择是向亲属成员提供选择,将成员的行数据带到jtextfields,通过保存按钮进行修改和保存,如果使用相同的密钥更新成员数据,则会引发重复主键异常,如果为密钥输入新id,则会在成员的jtable中显示新成员

行为背后:

无论编写此应用程序的情况如何,问题在于在这一行中使用了过多的方法:

  String selectedMemberPrimaryKey = getMembersWithoutPhotos().get(jTable5.convertRowIndexToView(jTable5.getSelectedRow())).getId() ;
检索亲属成员的密钥就足够了,可以通过id列更新亲属成员数据库表中相应的密钥记录,只需:

  String selectedMemberPrimaryKey = jTable5.getValueAt(jTable5.convertRowIndexToView(jTable5.getSelectedRow()), 0).toString();
,此不匹配导致检索另一个键,并指定另一个记录以使用相对成员的更新数据进行更新。因此,使用所需记录数据更新错误记录(键列和其他列)会导致重复主键异常,并且在使用人员的新相对成员的新数据更新错误记录的情况下,新记录会出现在所需人员的成员表中,这是一个成员从另一个错误的人的成员更新

因此,在java/mysql应用程序中,sql更新不能直接表现为sql插入,但它可能会留下插入效果,就像在这种情况下,如果这个错误的更新记录是自动更新或自动重新创建的,那么它会留下一些插入行为


感谢大家的关心、查看和尝试回答。

没有触发从建议的查询执行返回的0行,并且知道更新更新更新现有记录,插入新记录,感谢您提供应用程序写入更正指南。希望您能够跟踪您的问题。实际上无法解决问题,使用相同的输出:这是一个更新查询得到了一个异常!键“PRIMARY”的重复条目“00003/2-00003”我试图更改查询以确保这是已执行的查询,并且我将更新查询更改为错误的选择查询,它在异常结果中原样出现,因此system.out.println prints从开始到结束都确保了正确的条件块,并且通过更改查询确保执行的查询,并且更改的查询出现在异常结果中,但仍然无法理解update为何会执行这样的insert语句,或者使用新键插入新记录,或者通过重复键例外我已在按钮中注释了整个insert code条件部分,而更新的结果仍然是这样的插入行为:这是一个更新查询得到的异常!键“主”的重复条目“00003/1-00003”