判断生成的值添加到数据库后不添加重复值

我想判断 我生成的值去跟数据库里的值比较。如果有 相同值,不添加。如果没有相同值添加。这个逻辑能给我举个例子吗?。或者我生成的值添加后判断,已生成的值不再添加到数据库。求举个例,用什么方法弄。

最简单的办法就是设置这个字段为唯一索引!后台插入时捕获重复添加的错误,抛出指定异常信息提示

方法一:把数据库想要唯一值的字段,设置为唯一键。举例学号不重复。

-- 增加唯一键
create table my_unique(
    number char(10) unique comment '学号',
    name varchar(20) not null
)charset utf8;

方法二:使用数据库连接的工具类jdbcutils,根据sql从数据库查出想要的值,再用你生成的值和数据库的值去比较,如果重复则不做任何操作,如果不重复则插入数据库。
数据库连接的工具类jdbcutils代码如下所示

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

public class JdbcUtils {

    /**
     * 获取连接
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static Connection getConnection() throws IOException, ClassNotFoundException, SQLException {
        Properties props = new Properties();
        props.load(JdbcUtils.class.getClassLoader().getResourceAsStream("application" +
                ".properties"));

        String driverClassName = props.getProperty("driverClassName");
        String url = props.getProperty("url");
        String user = props.getProperty("username");
        String password = props.getProperty("password");

        Class.forName(driverClassName);

        //2.获取连接
        Connection conn = DriverManager.getConnection(url, user, password);

        return conn;
    }


    public static void release(Connection conn) throws SQLException {
        conn.close();
    }


    public static void release(Connection conn, PreparedStatement ps) throws SQLException {
        ps.close();
        conn.close();
    }

    public static void release(Connection conn, PreparedStatement ps, java.sql.ResultSet rs) throws SQLException {
        rs.close();
        ps.close();
        conn.close();
    }
}

使用工具类从数据库查询值,再根据你生成的值做比较,如果重复则不做任何操作,如果不重复则插入数据库。代码示例如下所示:

import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

/*
    使用PrepareStatement完成查询
*/
public class PrepareStatement {
    @Test
    public void test2() throws SQLException {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        //从数据库中查询想要查询的数据
        try{
            //1.获取连接
            conn = JdbcUtils.getConnection();

            //2.通过当前连接,获取PrepareStatement,用于发送sql
            String sql = "select stunum,name,age,hobby,create_time from dw.stuinfo where stunum != ?";
            ps = conn.prepareStatement(sql);

            //3.填充占位符
            ps.setInt(1,100010);

            //4.执行sql
            //ResultSet结果集
            rs = ps.executeQuery();

            //假设这是你生成的值
            String randomName = "司马懿";

            //5.获取结果集中的数据
            while (rs.next()){ //移动结果集中记录到下一行,若有下一行则返回true,没有下一行则返回false
                //根据列的索引获取对应列的数据
                int stunum = rs.getInt(1);
                String name = rs.getString(2);
                int age = rs.getInt(3);
                String hobby = rs.getString(4);
                Date create_time = rs.getDate(5);


                if(name == randomName){
                    System.out.println("数据库已有值,不做任何操作");
                }else{
                    //数据库没有值,插入数据到数据库
                    String insertSql = "insert into dw.stuinfo(stunum,name,age,hobby,create_time)" +
                            " values(?,?,?,?,?)";
                    ps = conn.prepareStatement(sql);
                }

                System.out.println(stunum + "," + name + "," + age + "," + hobby + "," + create_time);
            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,ps,rs);
        }
    }
}

需要有唯一主键或唯一性索引


    <insert id="updateSettleForDuplicate">
        insert into t_quota_settle
            (year,quota_id,settle_amount,settle_price) values
        <foreach collection="list" item="item" separator="," >
            (#{item.year},#{item.quotaId},#{item.settleAmount},#{item.settlePrice})
        </foreach>
        ON DUPLICATE KEY UPDATE
         year = VALUES(year),quota_id = VALUES(quota_id),settle_amount =         
         VALUES(settle_amount),settle_price = VALUES(settle_price)
    </insert>

MySQL 批量插入:如何不插入重复数据?_码上得天下的博客-CSDN博客_mysql批量插入不重复 知识这个东西,看来真的要温故而知新,一直不用,都要忘记了????业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表,也可能是一个外部excel的导入那么问题来了,是不是每次插入之前都要查一遍,看看重不重复,在代码里筛选一下数据,重复的就过滤掉呢?向大数据数据库中插入值时,还要判断插入是否重复,然后插入。如何提高效率看来这个问题不止我一个人苦恼过。解决的办法有很多种,不同的场景解决方案也不一样,数据量很小的情况下,怎么搞都行,但是数据量很大的时候,这就不是一个简单的问题了。 https://blog.csdn.net/meser88/article/details/120183441

把不能重复的字段添加唯一性索引,或者设置为主键,插入的时候数据库会自动检查,如果已经存在就会插入失败。

如有帮助,请采纳,十分感谢!

有两个办法,一是在你要求不重复的这一列数据库设置唯一约束,重复的值就添加不进去了,另一个办法就跟你说的一样,值生成了,按值去查询数据库,查到了就说明重复,就不添加,查不到,就可以添加

1.可以在代码中判断,查询这个值在库里有没有决定是否添加
2.也可以在数据库设置唯一值,插入失败抛异常

通过数据库设置主键或者唯一值进行,或者你的程序代码做个验证逻辑,如查询一下数据库是否有重复数据,有的话就不加了,望采纳,谢谢!

这个一般可以在数据库中设置为主键进行约束,也可以在代码中判断是否重复,不重复就push
一下

不添加重复值主要涉及到一些单据编号,一些单据编号需要电脑生成,
建立一个表,存储单据编号
保存,类别、年、月、日,Batno(000-999)
保存数据的时候,取一个单号
并且更新年、月、日(日期发生编号),Batno(递增)
这样的话就不会重复

要么用数据库自己去判断,设置唯一约束;
要么程序去判断,插入前先查询下是否存在

1、设置唯一约束
2、插入前先判断

第一步,在项目中添加实体类,代码如下

/**
 * 统一异常处理类
 */
@RestControllerAdvice
public class ExceptionHandler {
    private final Logger logger = Logger.getLogger(ExceptionHandler.class);
    
    @ExceptionHandler(DuplicateKeyException.class)
    public void dataRepeatException(Exception e){
        logger.error( e.getMessage() ) ;
        throw new RuntimeException("生成的数据已存在,请不要重复添加");
    }
}

第二步,在数据库中给表中被校验的字段添加唯一索引约束,如图

img

第三步:自己写添加逻辑

@Test
public void testInsert() {
    String xxxId = UUID.randomUUID().toString();//xxxId为被校验唯一性的数据
    myService.insert(xxxId);//自己写一个接口,然后调用dao插入数据库,此处不再细说,实现起来不难
}


可以用2种办法解决:
1.设计表时,将不能重复的值设置成主键或唯一
2.代码判段,插入之前先判断值在数据库中是否存在,存在不插入,不存在则插入。

看我博客写的uuid生成,可以生成无序的唯一id、也可以生成有序的唯一id。现成代码直接复制,拿走不谢