避免MySQL数据重复插入的方法(mysql不能重复插入)
在开发过程中,避免出现数据重复插入是一件非常重要的事情。避免重复插入,除了在应用层做判断外,我们还可以从数据库层面入手,在设计表结构时添加唯一约束、使用INSERT IGNORE、使用ON DUPLICATE KEY UPDATE等方式避免重复插入。
一、 添加唯一约束
在设计表结构时,我们可以给需要去重的字段添加唯一索引。这样在插入数据时,如果发现该字段已经存在,则会导致插入失败。例如:
CREATE TABLE user (
id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL,
eml VARCHAR(50) NOT NULL, PRIMARY KEY (id),
UNIQUE KEY unique_eml (eml)) ENGINE=InnoDB;
此时,当我们插入一条eml重复的记录时,会直接失败,避免将重复数据插入到表中。
二、使用INSERT IGNORE
INSERT IGNORE语法表示在插入时,如果发现主键或唯一索引已经存在,则忽略该插入操作。例如:
INSERT IGNORE INTO user (name,eml) VALUES ('Tom','tom@example.com');
这里插入Tom和eml为tom@example.com的记录,如果已经存在Tom或者eml为tom@example.com的记录,则该插入操作将被忽略。
三、使用ON DUPLICATE KEY UPDATE
ON DUPLICATE KEY UPDATE语法表示在插入时,如果发现主键或唯一索引已经存在,则执行更新操作。例如:
INSERT INTO user (name,eml) VALUES ('Tom','tom@example.com')
ON DUPLICATE KEY UPDATE name = 'Tom', eml = 'tom@example.com';
这里插入Tom和eml为tom@example.com的记录,如果已经存在Tom或者eml为tom@example.com的记录,则该插入操作将执行更新操作,将该记录的name和eml更新为Tom和tom@example.com。
四、代码示例
以下是一段Java代码示例,使用JDBC连接MySQL数据库,通过添加唯一约束的方式,实现避免重复插入。当出现重复数据时,会抛出SQLIntegrityConstrntViolationException异常。
Connection conn = null;
PreparedStatement stmt = null;try {
conn = DriverManager.getConnection(url, username, password); String sql = "INSERT INTO user (name,eml) VALUES (?, ?)";
stmt = conn.prepareStatement(sql); stmt.setString(1, "Tom");
stmt.setString(2, "tom@example.com"); int affectedRows = stmt.executeUpdate();
if (affectedRows == 0) { // 插入失败
}} catch (SQLIntegrityConstrntViolationException e) {
// 出现重复数据,插入失败} catch (SQLException e) {
// SQL执行失败} finally {
try { stmt.close(); } catch (Exception e) {} try { conn.close(); } catch (Exception e) {}
}
总结
避免MySQL数据重复插入的方法有添加唯一约束、使用INSERT IGNORE、使用ON DUPLICATE KEY UPDATE等。我们可以根据实际情况选择不同的方法,在应用层尽可能避免重复插入,保证系统的数据正确性。