将数据添加到mysql数据库而不重复数据

时间:2012-02-01 07:41:05

标签: java mysql

我应该将我的csv文件中的数据添加到我的数据库中。我没有问题将数据添加到数据库中,但是,我的情况是我的java程序必须添加新值或将当前值更新到数据库中,比如在我的列“date”下。当我的当前数据库中未标识新数据时,将添加该数据。但是,在同一行下,有一个名为“需求”的列。如果日期相同但需求不同。它必须更新。目前,我的脚本只能从mysql中逐行检索数据,并与从csv文件中收集的数据进行比较。当日期不同时,它可以将数据添加到新行中。问题是我创建的java程序只能从头开始逐行读取。我会重复数据,因为它从最早的数据到最新的数据开始比较。例如,我最早的日期是01 jan,它与我的csv数据比较31 jan。但是,我后来的条目已经存储了31日元。但我的java程序继续添加这些数据,因为它从一开始就进行了比较。如果您需要更多信息,我会更详细地解释。

public void readDataBase(int val, String d1, String d2, String d3, String d4 ) throws Exception {
try {
     Class.forName("com.mysql.jdbc.Driver");
     connect = DriverManager.getConnection("jdbc:mysql://localhost/testdb?"
                        + "user=root&password=");
     statement = connect.createStatement();
     resultSet = statement.executeQuery("SELECT COUNT(*) FROM testdb.amg");
      while (resultSet.next()) {
      total = resultSet.getInt(1);
         }

         resultSet = statement.executeQuery("select * from testdb.amg");
         try{
                    int id;
                    String Date,Demand;
                    while (resultSet.next()) {
                    id = resultSet.getInt("id");

                    Date = resultSet.getString("Date");
                    Demand = resultSet.getString("Demand");
                    System.out.println("total: " + total);
                    System.out.println("d4: " + d4);
                    if (!Date.equals(d1) && !Demand.equals(d3))
                    {
                        int val1 = total +1;
                        preparedStatement = connect
                        .prepareStatement("insert into  testdb.amg values (?, ? ?)");
                        preparedStatement.setInt(1, val1);
                        preparedStatement.setString(2, d1);
                        preparedStatement.setString(3, d3);
                        preparedStatement.executeUpdate();

                        System.out.println("UpdatedII");

                    }

2 个答案:

答案 0 :(得分:3)

标识数据库中的不同列(date + demand + whatever_is_distinct)并在该组合上定义UNIQUE约束。

通过这样做,在插入期间,如果存在任何抛出的Constraint Violation异常,则更新该记录或者插入记录。

答案 1 :(得分:1)

正如Rocky所说,定义桌面上的唯一键。由于数据库是MySQL,您可以通过INSERT简单查询实现您想要的... ON DUPLICATE KEY UPDATE ... INSERT ... ON DUPLICATE KEY UPDATE Syntax

在你的情况下,它可以是

insert into  testdb.amg values (?, ? ?) on duplicate key update <update fields here>

所以最后的查询应该是

"insert into testdb.amg values (?, ?, ?) on duplicate key update Demand=?"

并添加

preparedStatement.setString(4, d3);