MySQL 插入数据 数据重复 从另一个表导入数据
当使用MySQL插入数据时,我们可以根据需求选择合适的插入语句。
一、方法分类

二、具体方法
| 使用场景 | 作用 | 语句 | 注意 |
|---|---|---|---|
| 常规插入 | |||
| 忽略字段名 | |||
| insert into 表名 values (值1, 值2,...,值n) | 默认value中的值依次填充所有字,如果出现唯一性冲突,就会抛出异常 | ||
| 按照字段插入 | |||
| insert into 表名(字段1, 字段2,...,字段n) values (值1, 值2,...,值n) | 字段和值一一对应 | ||
| 一次性插入多条数据 | |||
| insert into 表名(字段1, 字段2,...,字段n) values (值a1, 值a2,...,值an),(值b1, 值b2,...,值bn) | 多行之间用逗号隔开,不需要再次写insert into语句 | ||
| 从另一个表导入 | 导出A表的某些数据插入到B表 | insert into 表名B(字段B1, 字段B2,...,字段Bn) select 字段A1, 字段A2,...,字段An from 表名A where [执行条件] | 字段A和B可以字段名称不一样,但是数据类型必须一致 |
| 插入时数据重复 | |||
| 如果记录存在报错 | |||
| insert into 表名(字段1, 字段2,...,字段n) values (值1, 值2,...,值n) | 如果插入的数据记录存在,报错并捕获异常,不存在则直接新增记录 | ||
| 如果记录存在不插入记录 | |||
| insert ignore into 表名(字段1, 字段2,...,字段n) values (值1, 值2,...,值n) | 如果插入的数据记录存在就保存旧记录忽略新记录,不存在则直接新增记录 | ||
| 不论记录是否存在都要插入记录 | |||
| replace 表名(字段1, 字段2,...,字段n) values (值1, 值2,...,值n) | 如果插入的数据记录存在就先删除再更新,不存在则直接新增记录 | ||
| 如果记录存在更新指定字段 | |||
| insert into … on duplicate key update | 如果插入的数据记录存在就更新指定字段,不存在则直接新增记录 |
三、实例
students 表 (id表示主键,name是姓名,score是平均成绩)
| id | name | score |
|---|---|---|
| 1 | 李明 | 67 |
(1)常规插入
- 忽略字段名
insert into
students
values(null, '张三', '74');
执行后结果
| id | name | score |
|---|---|---|
| 1 | 李明 | 67 |
| 2 | 张三 | 74 |
- 按照字段插入
insert into
students(name)
values('孙华');
执行后结果
| id | name | score |
|---|---|---|
| 1 | 李明 | 67 |
| 2 | 张三 | 74 |
| 3 | 孙华 |
- 一次性插入多条数据
insert into
students(name, score)
values('刘平', '56'),('周雨', '90');
执行后结果
| id | name | score |
|---|---|---|
| 1 | 李明 | 67 |
| 2 | 张三 | 74 |
| 3 | 孙华 | |
| 4 | 刘平 | 56 |
| 5 | 周雨 | 90 |
(2)从另一个表导入
students 表 (id表示主键,name是姓名,score是平均成绩)
| id | user_name | mobile_phone_number |
|---|---|---|
| 1 | 马化腾 | 13800000000 |
| 2 | 任正非 | 13800000011 |
| 3 | 马云 | 13800000022 |
- 导出users表的某些数据插入到students表
insert into
students(name,score)
select
user_name,
mobile_phone_number
from users where id <> 3;
执行结果
| id | name | score |
|---|---|---|
| 1 | 李明 | 67 |
| 2 | 张三 | 74 |
| 3 | 孙华 | |
| 4 | 刘平 | 56 |
| 5 | 周雨 | 90 |
| 6 | 马化腾 | 13800000000 |
| 7 | 马云 | 13800000022 |
注意:只要对应字段的类型一样,字段不一样也可以导入数据,不会冲突。
(3)插入时数据重复
- 如果记录存在报错
insert into
students
values(1, '张三', '74');
执行结果: 报错
Duplicate entry '1' for key 'PRIMARY'
- 如果记录存在不插入记录
insert ignore into
students(id,name,score)
values(1, '张三', '74');
执行结果:不插入不报错
Affected rows:0
| id | name | score |
|---|---|---|
| 1 | 李明 | 67 |
| 2 | 张三 | 74 |
| 3 | 孙华 | |
| 4 | 刘平 | 56 |
| 5 | 周雨 | 90 |
| 6 | 马化腾 | 13800000000 |
| 7 | 马云 | 13800000022 |
- 不论记录是否存在都要插入记录
replace
students
values(1, '张三', '74');
执行结果
| id | name | score |
|---|---|---|
| 1 | 张三 | 74 |
| 2 | 张三 | 74 |
| 3 | 孙华 | |
| 4 | 刘平 | 56 |
| 5 | 周雨 | 90 |
| 6 | 马化腾 | 13800000000 |
| 7 | 马云 | 13800000022 |
- 如果记录存在更新指定字段
insert into
students(id)
values(1) on duplicate key
update
name = '李明',
score = '67';
执行结果
| id | name | score |
|---|---|---|
| 1 | 李明 | 67 |
| 2 | 张三 | 74 |
| 3 | 孙华 | |
| 4 | 刘平 | 56 |
| 5 | 周雨 | 90 |
| 6 | 马化腾 | 13800000000 |
| 7 | 马云 | 13800000022 |
创建 students 表的代码
-- ----------------------------
-- Table structure for students
-- ----------------------------
DROP TABLE IF EXISTS `students`;
CREATE TABLE `students` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学生id',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
`score` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '成绩',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of students
-- ----------------------------
INSERT INTO `students` VALUES (1, '李明', '67');
创建 users 表的代码
-- ----------------------------
-- Table structure for students
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
`mobile_phone_number` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号码',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of students
-- ----------------------------
INSERT INTO `users` VALUES (1, '马化腾', '13800000000');
INSERT INTO `users` VALUES (2, '任正非', '13800000011');
INSERT INTO `users` VALUES (3, '马云', '13800000022');
四、注意事项
(1)不写字段名,需要填充自增ID
- [使用]:0或者null或者default,自增id默认从1开始。
- [使用]:或者没有在自增id中出现的(不重复)数(例如-1,-2),浮点型数据例如3.4,最后显示3,会进行四舍五入。即使定义了int类型,输入‘3’或者浮点型,都会强制转化为int类型,但是输入'a'会报错。具体细节可以看源码。
问题:第一个字段id为什么可以写null?
如果建表的时候写了id为自增id,而写0或者null或者default或者没有在自增id中出现的(不重复)数(例如-1,-2),系统都会自动填充id。如果建表的时候没有写明是自增id,那么主键一定是不能为空的,这个时候写null就会报错。
(2)按字段名填充,可以不录入id
- [注意]:字段要与值一一对应。
其余注意事项:
- 字段名可以省略,默认所有列;
- 录入值的类型和字段的类型要一致或兼容;
- 字段和值的个数必须一致。不能出现一行记录5个值,另外一行6个值的情况;
- 如果写了字段,即使是空值也不能空着,用null代替;
MySQL 插入数据 数据重复 从另一个表导入数据的更多相关文章
- mysql中把一个表的数据批量导入另一个表中
mysql中把一个表的数据批量导入另一个表中 不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将MySQL或MS SQLServer某个表的数据批量导入到另一个表的情况,甚至有时还需要指定 ...
- MySQL如果频繁的修改一个表的数据,那么这么表会被锁死。造成假死现象。
MySQL如果频繁的修改一个表的数据,那么这么表会被锁死.造成假死现象. 比如用Navicat等连接工具操作,Navicat会直接未响应,只能强制关闭软件,但是重启后依然无效. 解决办法: 首先执行: ...
- mysql根据逗号分割的字符串去关联查询另外一个表的数据
1.说明 在做显示数据的时候,一个字段会存那种逗号分割的字符串,那如何去根据逗号分割字符串去查询另一个表的数据呢? 首先我们查看一下需要显示的数据 select * from company wher ...
- Oracle 中用一个表的数据更新另一个表的数据
Oracle 中用一个表的数据更新另一个表的数据 分类: SQL/PLSQL2012-05-04 15:49 4153人阅读 评论(1) 收藏 举报 oraclemergesubqueryinsert ...
- 使用POI把查询到的数据表数据导出到Excel中,一个表一个sheet.最详细!!!
一.需求 我们会遇到开发任务: 经理:小王,你来做一下把数据库里的数据导出到Excel中,一个表是一个sheet,不要一个表一个Excel. 小王:好的,经理.(内心一脸懵逼) 二.前期准备 首先我们 ...
- sql的存储过程实例--动态根据表数据复制一个表的数据到另一个表
动态根据表数据复制一个表的数据到另一个表 把track表的记录 根据mac_id后两位数字,复制到对应track_? 的表中 如:mac_id=12345678910,则后两位10 对应表为track ...
- oracle 批量更新之将一个表的数据批量更新至另一个表
oracle 批量更新之将一个表的数据批量更新至另一个表 CreationTime--2018年7月3日17点38分 Author:Marydon Oracle 将一个表的指定字段的值更新至另一个 ...
- EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载
之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库.老版本的EF主要是通过Ob ...
- MySql中把一个表的数据插入到另一个表中的实现代码
web开发中,我们经常需要将一个表的数据插入到另外一个表,有时还需要指定导入字段,设置只需要导入目标表中不存在的记录,虽然这些都可以在程序中拆分成简单sql来实现,但是用一个sql的话,会节省大量代码 ...
- MySQL 数据库怎样把一个表的数据插入到另一个表
web开发中,我们经常需要将一个表的数据插入到另外一个表,有时还需要指定导入字段,设置只需要导入目标表中不存在的记录,虽然这些都可以在程序中拆分成简单sql来实现,但是用一个sql的话,会节 ...
随机推荐
- 题解 CF630L Cracking the Code
前言 为什么没有人暴力快速幂啊,Ta不香嘛/kel 题意 设读入为 \(abcde\) ,求 \(acedb^5\mod{10^5}\) 的结果. \(\sf {Solution}\) 显然暴力啊. ...
- pod(八):pod的调度——将 Pod 指派给节点
目录 一.系统环境 二.前言 三.pod的调度 3.1 pod的调度概述 3.2 pod自动调度 3.2.1 创建3个主机端口为80的pod 3.3 使用nodeName 字段指定pod运行在哪个节点 ...
- Oracle部署,关于日志文件系统选择(硬盘格式化、挂载)
之前部署过好多Oracle服务,采用的日志文件系统一直是ext3.但是我观察到很多人在格式化/挂载数据盘时,采用的日志文件系统类型有ext3.ext4.xfs等,这不禁让我发出疑问,哪个类型的数据处理 ...
- 达梦-DBLINK数据库链接
aliases: [达梦 DBlink] tags: [数据库,DM,Blog] link: date: 2022-09-06 说明:DM-Oracle指的是在DM中创建链接至Oracle的Dblin ...
- 英格索兰扳手网口通信协议EOR原理
前言 前几天遇到这个需求,需要记录扳手每一次的周期数据,但是我不知道通信协议是什么,只知道是一个tcp的连接,问售后,也不给我网口调试软件(英格索兰自己家的软件).经过我俩天的谷歌,终于找到了他们公司 ...
- 关于linux mint更改资源管理器的快捷键
前言 首先要知道 linux mint 的默认资源管理器是 nemo 我很不习惯 ctrl+d 在nemo里面是 收藏到侧边栏 我习惯 ctrl+d 在windows上是删除文件 所以下面我就修改这个 ...
- 关于最新版本listen1 (2.1.6)的修改心得(添加下载功能)
注:本文只作为技术交流 前言 再次感谢 listen1 的作者开发出如此强大的音乐播放器 项目地址 上一篇的文章没有解决跨域问题(命名不能正确命名), 上一篇文章 地址 这次解决了,并简单的美化了下载 ...
- 【翻译】rocksdb调试指引
rocksdb调试指引 翻译自官方wiki:https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide 转载请注明出处:https:// ...
- 【Java SE】Day08 String类、static关键字、Arrays类、Math类
一.String类 1.概述 所有双引号字符串,都是String类的对象 字符串常量,会存在字符串常量池中 2.创建 构造函数--空构造.字符数组.字节(byte ASCII码)数组 3.常用方法-- ...
- 【每日一题】【链表or双指针循环条件】2022年2月26日-NC96 判断一个链表是否为回文结构
描述给定一个链表,请判断该链表是否为回文结构.回文是指该字符串正序逆序完全一致. 思路: public boolean isPail (ListNode head) { ListNode node = ...