在SQL中插入数据,如果已经插入则更新

11

我希望将数据插入SQL数据库表中,如果已经有一些数据被插入,那么我想要更新这些数据。如何使用Java实现这个功能?请帮助我,先谢过了。


1
哪个数据库?SQL Server?MySQL?PostgreSQL?DB2?Oracle? - Kayaman
你是否使用任何ORM框架? - Anmol Gupta
7个回答

7
标准的SQL语句用于INSERT(如果是新数据)或UPDATE(如果已存在),称为MERGE
由于您没有指定您要查询哪个DBMS方言,我将引导您查看维基百科文章"Merge (SQL)",该文章涵盖了大多数DBMS方言。简而言之:
MERGE INTO tablename USING table_reference ON (condition)
WHEN MATCHED THEN
  UPDATE SET column1 = value1 [, column2 = value2 ...]
WHEN NOT MATCHED THEN
  INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...])

Database management systems Oracle Database, DB2, Teradata, EXASOL, CUBRID, MS SQL and Vectorwise support the standard syntax. Some also add non-standard SQL extensions.

MySQL: INSERT ... ON DUPLICATE KEY UPDATE

SQLite: INSERT OR REPLACE INTO

PostgreSQL: INSERT INTO ... ON CONFLICT


1
这个问题与Java(JDBC.HSQL或其他ORM)有关。 - Eddy Bayonne
1
@EddyBayonne 是的,你也可以从Java中运行这些SQL语句。问题中没有提到ORM,所以使用JDBC运行SQL是一个完全有效的答案。 - Andreas
我们应该优先选择能够在一个连接和语句中完成工作的策略。以上答案最适合避免批处理中多次连接开启和性能影响。 - suhas0sn07

6
您可以使用EXISTS关键字来检查行是否存在:
IF EXISTS (SELECT TOP 1 * FROM...)
BEGIN
    UPDATE....
END
ELSE
BEGIN
   INSERT...
END

1
最好的做法是直接运行更新操作并检查更新了多少行。 - user330315

3

只需确定您数据集中的唯一项(例如Id或代码)。然后尝试首先使用该项执行SELECT查询。如果结果集为空,则执行INSERT操作,否则尝试更新详细信息。


2
package com.stackwork;

//STEP 1. Import required packages
import java.sql.*;
import java.util.Scanner;

public class Updation {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/Employee";

   //  Database credentials
   static final String USER = "root";
   static final String PASS = "admin";
   private static Scanner sc;

   public static void main(String[] args) {
   Connection conn = null;
   Statement stmt = null;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");
      //STEP 3: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);
      //STEP 4: Execute a query
      System.out.println("Creating statement...");
      stmt = conn.createStatement();
      String sql;
      //STEP 5: Get the employee_id for whom data need to be updated/inserted
      sc = new Scanner(System.in);
      System.out.println("Enter the Employee_id for the record to be updated or inserted");
      int Emp_idvalue=sc.nextInt();
      sql = "SELECT * FROM EmployeeDetails where Emp_id="+Emp_idvalue;
      ResultSet rs = stmt.executeQuery(sql);
      if (!rs.next())
      {
          //STEP 6: If the previous details is not there ,then the details will be inserted newly
          System.out.println("Enter the name to be inserted");
          String Emp_namevalue =sc.next();
          System.out.println("Enter the address to be inserted");
          String Emp_addvalue =sc.next();
          System.out.println("Enter the role to be inserted");
          String Emp_rolevalue =sc.next();
          PreparedStatement ps = conn
                    .prepareStatement("insert into EmployeeDetails values(?,?,?,?)");
            ps.setString(2, Emp_namevalue);
            ps.setString(3, Emp_addvalue);
            ps.setString(4, Emp_rolevalue);
            ps.setInt(1, Emp_idvalue);
            ps.executeUpdate();
            System.out.println("Inserted successfully");
      }
      else
      {
        //STEP 7: If the previous details is  there ,then the details will be updated 
          System.out.println("Enter the name to be updated");
          String Emp_namevalue =sc.next();
          System.out.println("Enter the address to be updated");
          String Emp_addvalue =sc.next();
          System.out.println("Enter the role to be updated");
          String Emp_rolevalue =sc.next();
          String updateQuery = "update EmployeeDetails set Emp_id=?,Emp_name=?, Emp_address=?, Emp_role=? where Emp_id='"
                    + Emp_idvalue + "'";
            PreparedStatement ps1 = conn.prepareStatement(updateQuery);
            ps1.setString(2, Emp_namevalue);
            ps1.setString(3, Emp_addvalue);
            ps1.setString(4, Emp_rolevalue);
            ps1.setInt(1, Emp_idvalue);
            ps1.executeUpdate();    
            System.out.println("updated successfully");

      }
      //Clean-up environment
      rs.close();
      stmt.close();
      conn.close();
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();

   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
  }
}
}

2

首先,您需要检查表中是否存在数据。如果存在,则使用更新查询,否则插入数据。这是一个简单的过程。


2
尝试以下方式: 示例查询

INSERT INTO table (id, name, city) VALUES(1, "ABC", "XYZ") ON DUPLICATE KEY UPDATE
name="ABC", city="XYZ"

有关更多帮助,请参阅文档。 点击这里

2

将任何字段设置为唯一标识符。 例如,考虑要在表名为**EmployeeDetails**的表中输入员工详细信息,在这种情况下,可以将employee_id视为唯一标识符。

使用SELECT查询 选择* from EmployeeDetails where employee_id="唯一键值"; 如果结果集不为空,则使用UPDATE查询更新字段。

update EmployeeDetails set Employee_id =?,Full_name =?,Designation =?,Email_id =?,Password =?where Employee_id ='" + id + "'"; 如果结果集为空,则使用INSERT查询将值插入表中

Insert into EmployeeDetails values(...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接