MySQL 插入数据的时候自动忽略重复数据

MySQL中插入数据,如果插入的数据在表中已经存在(主键或者唯一键已存在),使用insert into语法的时候,如果遇到重复数据,会直接报错,导致事务回滚,所有插入数据,全部失败。如果想要忽略重复数据,只插入不重复的数据,可以使用以下方法

一 :insert ignore 语法,它可以忽略插入重复的数据。

 

insert ignore into table_name values…

使用insert ignore语法插入数据时,如果发生主键或者唯一键冲突,则忽略这条插入的数据。

满足以下条件之一:

  • 主键重复
  • 唯一键重复

 

CREATE TABLE table_name(
  id int(11) NOT NULL,
  name varchar(50) DEFAULT NULL,
  age int(11) DEFAULT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY uk_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在这个表中:主键就是id ,唯一键就是name ,id或name重复了,就会忽略

 二:on duplicate key update 存在则更新

 即插入数据时,如果数据存在,则执行更新操作,前提条件同上,也是插入的数据字段设置了主键或唯一索引,测试SQL语句如下,当插入本条记录时,MySQL数据库会首先检索已有数据(idx_username索引),如果存在,则执行update更新操作,如果不存在,则直接插入:

 

03 replace into

 即插入数据时,如果数据存在,则删除再插入,前提条件同上,插入的数据字段需要设置主键或唯一索引,测试SQL语句如下,当插入本条记录时,MySQL数据库会首先检索已有数据(idx_username索引),如果存在,则先删除旧数据,然后再插入,如果不存在,则直接插入:

 

04 insert if not exists 存在则忽略 

即insert into … select … where not exist … ,这种方式适合于插入的数据字段没有设置主键或唯一索引,当插入一条数据时,首先判断MySQL数据库中是否存在这条数据,如果不存在,则正常插入,如果存在,则忽略: 

### 如何在 MySQL插入数据 #### 单条记录插入 可以使用 `INSERT INTO` 语句向表中插入单条记录。以下是具体语法: ```sql INSERT INTO table_name (column1, column2, ..., columnN) VALUES (value1, value2, ..., valueN); ``` 例如,假设有一个名为 `employees` 的表,包含三个字段:`id`, `name`, 和 `salary`。可以通过以下方式插入一条记录[^1]。 ```sql INSERT INTO employees (id, name, salary) VALUES (1, 'Alice', 5000); ``` --- #### 批量插入 当需要一次性插入多条记录时,可以利用批量插入功能来提高效率。其语法如下所示: ```sql INSERT INTO table_name (column1, column2, ..., columnN) VALUES (value1_1, value1_2, ..., value1_N), (value2_1, value2_2, ..., value2_N), ...; ``` 下面是一个具体的例子,继续以上述 `employees` 表为例: ```sql INSERT INTO employees (id, name, salary) VALUES (2, 'Bob', 6000), (3, 'Charlie', 7000); ``` 这将在一次操作中插入两条记录[^1]。 --- #### 来自其他表的插入 还可以通过查询另一个表的结果集作为插入的内容。这种情况下使用的语法为: ```sql INSERT INTO target_table (column1, column2, ...) SELECT source_column1, source_column2, ... FROM source_table WHERE condition; ``` 假如存在两个表 `source_employees` 和 `target_employees`,希望将符合条件的部分员工信息复制到目标表中,可执行以下 SQL: ```sql INSERT INTO target_employees (id, name, salary) SELECT id, name, salary FROM source_employees WHERE department = 'Sales'; ``` 此命令会把部门为 Sales 的所有员工信息从源表迁移到目标表。 --- #### 自动增长列处理 对于设置了 AUTO_INCREMENT 属性的列(通常是主键),无需显式提供值给这些列。数据库会在内部为其生成唯一的递增值。比如再次回到前面提到过的 `employees` 表定义里,默认情况下的 ID 字段会被自动填充合适数值[^3]。 示例代码展示不指定ID的情况: ```sql INSERT INTO employees (name, salary) VALUES ('David', 8000); ``` 在这种情形下,“David”的实际ID由系统决定并分配。 --- #### 幂等性考虑 - 防止重复插入 为了防止因网络或其他原因造成多次提交相同请求而导致的数据冗余问题,可以采用带有 IGNORE 关键字的形式来进行安全可靠的插入动作。即如果发现违反唯一约束条件的情形,则简单跳过而不抛异常终止整个事务流程[^2]。 相应SQL片段如下所见: ```sql INSERT IGNORE INTO employees (id, name, salary) VALUES (4, 'Eve', 9000); ``` 这里即使之前已经有同样ID等于4这条记录也不会引发错误提示而是默默忽略此次新增尝试[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值