表中存在唯一索引时,有时候为了避免插入重复数据,我们会使用MySQL的INSERT IGNORE语法,这样如果唯一索引有冲突就会自动忽略。 看起来很完美的一个解决办法,但是背后隐藏着一个坑,最后不得不放弃。

不仅仅是DUPLICATE KEY

INSERT IGNORE不仅仅会忽略DUPLICATE KEY错误,也会忽略非空错误

数据库有表student如下:

mysql> show create table student;

+---------+----------------------------+

| Table | Create Table |

+---------+----------------------------+

| student | CREATE TABLE `student` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(16) NOT NULL,

`class_id` int(11) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+---------+----------------------------+

1 row in set (0.00 sec)

因为class_id非空,所以插入失败

mysql> insert into student(name) values("tenmao");

ERROR 1364 (HY000): Field 'class_id' doesn't have a default value

使用ignore后插入失败,class_id被设置为int的默认值0

mysql> insert ignore into student(name) values("tenmao");

Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;

+---------+------+-----------------------------------------------+

| Level | Code | Message |

+---------+------+-----------------------------------------------+

| Warning | 1364 | Field 'class_id' doesn't have a default value |

+---------+------+-----------------------------------------------+

1 row in set (0.00 sec)

mysql> select * from student;

+----+--------+----------+

| id | name | class_id |

+----+--------+----------+

| 1 | tenmao | 0 |

+----+--------+----------+

1 row in set (0.00 sec)

varchar会被设置为默认值''(空字符串)

mysql> insert ignore into student(class_id) values(1);

Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> select * from student;

+----+--------+----------+

| id | name | class_id |

+----+--------+----------+

| 1 | tenmao | 0 |

| 2 | | 1 |

+----+--------+----------+

2 rows in set (0.00 sec)

字段NOT NULL是为了防止插入时漏掉这个字段,但是使用INSERT IGNORE后,会自动设置一个没有用的默认值,导致系统数据错误。 那怎么办?

ON DUPLICATE KEY

解决办法也很简单,使用ON DUPLICATE KEY

mysql> insert into student(id, name, class_id) values(1, '十毛', 2);

ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

mysql> insert into student(id, name, class_id) values(1, '十毛', 2) on duplicate key update id=id;

Query OK, 0 rows affected (0.00 sec)

参考

mysql ignore-columns_坑 - 当insert ignore遇到not null相关推荐

  1. MariaDB/MySQL防止重复插入相同记录:INSERT IGNORE或者REPLACE

    MySQL防止重复插入相同记录有2种常用的方法. 1 使用 INSERT IGNORE 使用 INSERT IGNORE 可以在插入具有相同主键的数据时不做重复插入. mysql> SELECT ...

  2. 语法:MySQL中INSERT IGNORE INTO和REPLACE INTO的使用

    mysql中insert into和replace into以及insert ignore用法区别:  mysql中常用的三种插入数据的语句:  insert into表示插入数据,数据库会检查主键, ...

  3. MySQL中INSERT IGNORE INTO和REPLACE INTO的使用

    mysql中insert into和replace into以及insert ignore用法区别:  mysql中常用的三种插入数据的语句:  insert into表示插入数据,数据库会检查主键, ...

  4. [数据库]---mysql 插入sql之 INSERT INTO和INSERT IGNORE INTO和REPLACE INTO和ON DUPLICATE KEY UPDATE比较应用

    mysql插入一条数据方式有四种,接下来逐个说明验证: 前提: 有一个表,作为本次测试: CREATE TABLE `zs_test` (`id` int(11) NOT NULL AUTO_INCR ...

  5. MySQL插入语句insert into,insert ignore into,insert into ... on duplicate key update,replace into-解决唯一键约束

    文章目录 常用插入语句 insert into insert ignore into insert into ... on duplicate key update replace into 使用场景 ...

  6. mysql:insert ignore、insert和replace区别

    指令 已存在 不存在 举例 insert 报错 插入 insert into names(name, age) values("小明", 23); insert ignore 忽略 ...

  7. Mysql insert 多种使用方式(insert into/insert ignore /replace into/on deplicate key update)

    Mysql insert 多种使用方式(insert into/insert ignore /replace into/on deplicate key update) 1 insert into t ...

  8. MySQL:插入数据insert ignore,重复数据自动忽略

    MySQL中插入数据,如果插入的数据在表中已经存在(主键或者唯一键已存在),使用insert ignore 语法可以忽略插入重复的数据. 1.insert ignore 语法 insert ignor ...

  9. MYSQL INSERT IGNORE 与INSERT INTO的区别

    mysql中常用的三种插入数据的语句: insert into表示插入数据,数据库会检查主键(PrimaryKey),如果出现重复会报错: replace into表示插入替换数据,需求表中有Prim ...

最新文章

  1. 原生js写三级联动 java_原生js三级联动的简单实现代码
  2. 《看完它面试必solo | 寻找C站宝藏》
  3. hdu 6899 Xor 数位dp
  4. jmeter校验结果_Jenkins在实际失败时验证JMeter构建是否成功
  5. 使用rpm包升级ntpd服务_服务器准备升级,小程序将暂停使用
  6. 那些慢慢消失的手机功能,最怀念第一个!
  7. Python版的百钱买百鸡问题
  8. spring boot + netty实现匿名聊天室 web版
  9. SMAA算法详解 - SMAABlendingWeightCalculationVS
  10. 2022-12-05 新希望六和 一面笔试 (面经六)
  11. 向下取整符号_22. 为什么 Python 中的整除是向下取整?
  12. 【uni-app】什么是uni-app?如何进行开发?如何连接微信开发者工具与安卓手机端?
  13. 使用Flutter实现仿微信录音的插件
  14. 【hardware】什么是H桥电路?
  15. 上课用计算机的好处,多媒体课件的优点
  16. 百度网盘安装在c盘显示系统权限限制的解决方法
  17. js 无弹框打印_打印预览,关闭窗口等js代码
  18. 微软抄袭 AppGet 始末,开源普法任重道远
  19. 阿里巴巴倡导的数据中台,到底是什么东东
  20. 【str家族】如何使用处理字符和字符串的库函数

热门文章

  1. Laravel 成为最佳 PHP 框架的 14 个理由!
  2. @开发者,一文搞懂什么是 C# 计时器!|CSDN 博文精选
  3. Mozilla 重磅推出物联网平台 WebThings!| 极客头条
  4. 力压 MongoDB、Redis,PostgreSQL 蝉联“年度数据库”!
  5. 华为否认窃密;贾跃亭陪许家印考察FF;谷歌或被罚95亿欧元 | 极客头条
  6. 微软发布 Windows 命令行参考文档,涵盖超 250 项控制台命令
  7. 为什么现在的监控系统容易硬盘坏?附原理解析
  8. 网络编程之 字节序和深入理解bind()函数
  9. mysql-libs 5.6.23_利用rpm包手把手教你安装MySQL5.6.23
  10. 识别图片并可视化_数据可视化3大发展方向