使用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)常规插入

  • 忽略字段名
  1. insert into
  2. students
  3. values(null, '张三', '74');

执行后结果

id name score
1 李明 67
2 张三 74
  • 按照字段插入
  1. insert into
  2. students(name)
  3. values('孙华');

执行后结果

id name score
1 李明 67
2 张三 74
3 孙华
  • 一次性插入多条数据
  1. insert into
  2. students(name, score)
  3. 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表
  1. insert into
  2. students(name,score)
  3. select
  4. user_name,
  5. mobile_phone_number
  6. from users where id <> 3;

执行结果

id name score
1 李明 67
2 张三 74
3 孙华
4 刘平 56
5 周雨 90
6 马化腾 13800000000
7 马云 13800000022

注意:只要对应字段的类型一样,字段不一样也可以导入数据,不会冲突。

(3)插入时数据重复

  • 如果记录存在报错
  1. insert into
  2. students
  3. values(1, '张三', '74');

执行结果: 报错

  1. Duplicate entry '1' for key 'PRIMARY'
  • 如果记录存在不插入记录
  1. insert ignore into
  2. students(id,name,score)
  3. values(1, '张三', '74');

执行结果:不插入不报错

  1. Affected rows:0
id name score
1 李明 67
2 张三 74
3 孙华
4 刘平 56
5 周雨 90
6 马化腾 13800000000
7 马云 13800000022
  • 不论记录是否存在都要插入记录
  1. replace
  2. students
  3. values(1, '张三', '74');

执行结果

id name score
1 张三 74
2 张三 74
3 孙华
4 刘平 56
5 周雨 90
6 马化腾 13800000000
7 马云 13800000022
  • 如果记录存在更新指定字段
  1. insert into
  2. students(id)
  3. values(1) on duplicate key
  4. update
  5. name = '李明',
  6. score = '67';

执行结果

id name score
1 李明 67
2 张三 74
3 孙华
4 刘平 56
5 周雨 90
6 马化腾 13800000000
7 马云 13800000022

创建 students 表的代码

  1. -- ----------------------------
  2. -- Table structure for students
  3. -- ----------------------------
  4. DROP TABLE IF EXISTS `students`;
  5. CREATE TABLE `students` (
  6. `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学生id',
  7. `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
  8. `score` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '成绩',
  9. PRIMARY KEY (`id`) USING BTREE
  10. ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
  11. -- ----------------------------
  12. -- Records of students
  13. -- ----------------------------
  14. INSERT INTO `students` VALUES (1, '李明', '67');

创建 users 表的代码

  1. -- ----------------------------
  2. -- Table structure for students
  3. -- ----------------------------
  4. DROP TABLE IF EXISTS `users`;
  5. CREATE TABLE `users` (
  6. `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  7. `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
  8. `mobile_phone_number` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号码',
  9. PRIMARY KEY (`id`) USING BTREE
  10. ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
  11. -- ----------------------------
  12. -- Records of students
  13. -- ----------------------------
  14. INSERT INTO `users` VALUES (1, '马化腾', '13800000000');
  15. INSERT INTO `users` VALUES (2, '任正非', '13800000011');
  16. 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 如何实现数据插入的更多相关文章

  1. Mysql存储过程查询数据插入别的表里。

    DELIMITER// CREATE PROCEDURE setRoomManger2() BEGIN ); ; DECLARE cur CURSOR FOR SELECT roomid FROM n ...

  2. MySql中把一个表的数据插入到另一个表中的实现代码

    web开发中,我们经常需要将一个表的数据插入到另外一个表,有时还需要指定导入字段,设置只需要导入目标表中不存在的记录,虽然这些都可以在程序中拆分成简单sql来实现,但是用一个sql的话,会节省大量代码 ...

  3. mysql利用存储过程批量插入数据

    最近需要测试一下mysql单表数据达到1000W条以上时增删改查的性能.由于没有现成的数据,因此自己构造,本文只是实例,以及简单的介绍. 首先当然是建表: [sql]view plaincopy CR ...

  4. mysql触发器的例子--插入前更新数据

    本文介绍下,一个mysql触发器的例子,在数据插入前更新相关内容,有需要的朋友参考下. mysql触发器的例子,如下: view source print? 001 mysql> CREATE  ...

  5. MySQL将表a中查询的数据插入到表b中

    MySQL将表a中查询的数据插入到表b中 假设表b存在 insert into b select * from a; 假设表b不存在 create table b as select * from a ...

  6. PHP+Mysql————表单数据插入数据库及数据提取

    站点在进行新用户注冊时,都会将用户的注冊信息存入数据库中,须要的时候再进行提取.今天写了一个简单的实例. 主要完毕下面几点功能: (1)用户进行注冊,实现password反复确认,验证码校对功能. ( ...

  7. (MariaDB/MySQL)之DML(1):数据插入

    本文目录: 1.insert和replace插入数据 1.1 insert into values() 1.2 insert into set 1.3 insert into select_state ...

  8. mysql数据插入前判断是否存在

    今天在对一些抓取到的数据做插入的时候,因为使用了定时器,每间隔几分钟会抓取一次,导致很多数据插入的是重复数据,为了解决这个问题, 一般是在插入之前先通过一个标识去查询表数据看是否已经有了,没有再执行插 ...

  9. mysql命令行批量插入100条数据命令

    先介绍一个关键字的使用: delimiter 定好结束符为"$$",(定义的时候需要加上一个空格) 然后最后又定义为";", MYSQL的默认结束符为" ...

  10. MySQL 数据库怎样把一个表的数据插入到另一个表

         web开发中,我们经常需要将一个表的数据插入到另外一个表,有时还需要指定导入字段,设置只需要导入目标表中不存在的记录,虽然这些都可以在程序中拆分成简单sql来实现,但是用一个sql的话,会节 ...

随机推荐

  1. Python基础之模块:1、模块的导入和使用

    目录 一.模块 1.简介 2.模块的表现形式 二.模块的分类 1.自定义模块 2.内置模块 3.第三方模块 三.导入模块的句式 学前须知: 1.import句式 2.from...import...句 ...

  2. loguru库使用

    参考: https://github.com/Delgan/loguru https://loguru.readthedocs.io/en/stable/overview.html https://b ...

  3. java学习之注解

    0x00前言 1.注解是什么: (1)可以叫做注释类型,注解是一种引用数据类型,编译后也是生成class文件 (2)提供信息给编译器: 编译器可以利用注解来探测错误和警告信息 比如 @Override ...

  4. gorm

    特性 全功能 ORM 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承) Create,Save,Update,Delete,Find 中钩子方 ...

  5. 2022-11-16 Acwing每日一题

    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...

  6. Ansible执⾏速度优化

    个人名片: 因为云计算成为了监控工程师‍ 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying 优化⼀: 开启SSH长连接 Ansible模式是使⽤SSH和远程主机进⾏通信, 所以Ansi ...

  7. Docker原理(图解+秒懂+史上最全)

    背景:下一个视频版本,从架构师视角,尼恩为大家打造高可用.高并发中间件的原理与实操. 目标:通过视频和博客的方式,为各位潜力架构师,彻底介绍清楚架构师必须掌握的高可用.高并发环境,包括但不限于: 高可 ...

  8. pycharm 2021.2.1专业版破解

    1.网址:https://gitee.com/pengzhile/ide-eval-resetter 2.点击下载.下载后直接丢进pycharm中. 3.勾选.重启 .查看

  9. Clickhouse表引擎探究-ReplacingMergeTree

    作者:耿宏宇 1 表引擎简述 1.1 官方描述 MergeTree 系列的引擎被设计用于插入极大量的数据到一张表当中.数据可以以数据片段的形式一个接着一个的快速写入,数据片段在后台按照一定的规则进行合 ...

  10. CVE-2020-1938与CVE-2020-13935漏洞复现

    前言 最近在腾讯云上买了个服务器,准备用来学习.在安装了7.0.76的tomcat后,腾讯云提醒我存在两个漏洞,分别是CVE-2020-1938和CVE-2020-13935,在修复完漏洞后,准备复现 ...