mysql ignore-columns_坑 - 当insert ignore遇到not null
表中存在唯一索引时,有时候为了避免插入重复数据,我们会使用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相关推荐
- MariaDB/MySQL防止重复插入相同记录:INSERT IGNORE或者REPLACE
MySQL防止重复插入相同记录有2种常用的方法. 1 使用 INSERT IGNORE 使用 INSERT IGNORE 可以在插入具有相同主键的数据时不做重复插入. mysql> SELECT ...
- 语法:MySQL中INSERT IGNORE INTO和REPLACE INTO的使用
mysql中insert into和replace into以及insert ignore用法区别: mysql中常用的三种插入数据的语句: insert into表示插入数据,数据库会检查主键, ...
- MySQL中INSERT IGNORE INTO和REPLACE INTO的使用
mysql中insert into和replace into以及insert ignore用法区别: mysql中常用的三种插入数据的语句: insert into表示插入数据,数据库会检查主键, ...
- [数据库]---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 ...
- 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 使用场景 ...
- mysql:insert ignore、insert和replace区别
指令 已存在 不存在 举例 insert 报错 插入 insert into names(name, age) values("小明", 23); insert ignore 忽略 ...
- 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 ...
- MySQL:插入数据insert ignore,重复数据自动忽略
MySQL中插入数据,如果插入的数据在表中已经存在(主键或者唯一键已存在),使用insert ignore 语法可以忽略插入重复的数据. 1.insert ignore 语法 insert ignor ...
- MYSQL INSERT IGNORE 与INSERT INTO的区别
mysql中常用的三种插入数据的语句: insert into表示插入数据,数据库会检查主键(PrimaryKey),如果出现重复会报错: replace into表示插入替换数据,需求表中有Prim ...
最新文章
- 原生js写三级联动 java_原生js三级联动的简单实现代码
- 《看完它面试必solo | 寻找C站宝藏》
- hdu 6899 Xor 数位dp
- jmeter校验结果_Jenkins在实际失败时验证JMeter构建是否成功
- 使用rpm包升级ntpd服务_服务器准备升级,小程序将暂停使用
- 那些慢慢消失的手机功能,最怀念第一个!
- Python版的百钱买百鸡问题
- spring boot + netty实现匿名聊天室 web版
- SMAA算法详解 - SMAABlendingWeightCalculationVS
- 2022-12-05 新希望六和 一面笔试 (面经六)
- 向下取整符号_22. 为什么 Python 中的整除是向下取整?
- 【uni-app】什么是uni-app?如何进行开发?如何连接微信开发者工具与安卓手机端?
- 使用Flutter实现仿微信录音的插件
- 【hardware】什么是H桥电路?
- 上课用计算机的好处,多媒体课件的优点
- 百度网盘安装在c盘显示系统权限限制的解决方法
- js 无弹框打印_打印预览,关闭窗口等js代码
- 微软抄袭 AppGet 始末,开源普法任重道远
- 阿里巴巴倡导的数据中台,到底是什么东东
- 【str家族】如何使用处理字符和字符串的库函数
热门文章
- Laravel 成为最佳 PHP 框架的 14 个理由!
- @开发者,一文搞懂什么是 C# 计时器!|CSDN 博文精选
- Mozilla 重磅推出物联网平台 WebThings!| 极客头条
- 力压 MongoDB、Redis,PostgreSQL 蝉联“年度数据库”!
- 华为否认窃密;贾跃亭陪许家印考察FF;谷歌或被罚95亿欧元 | 极客头条
- 微软发布 Windows 命令行参考文档,涵盖超 250 项控制台命令
- 为什么现在的监控系统容易硬盘坏?附原理解析
- 网络编程之 字节序和深入理解bind()函数
- mysql-libs 5.6.23_利用rpm包手把手教你安装MySQL5.6.23
- 识别图片并可视化_数据可视化3大发展方向