MySQL插入数据(六)上

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: MySQL插入数据(六)

表已经创建成功,并且还可以自由地修改表的结构, 但是还没有在表里面添加数据。 前期的准备工作已经做好了,那么接下来,就需要插入数据了。


MySQL的插入数据 主要有以下四种情况:


1 . 插入一条完整的记录


2 . 插入记录的一部分


3 . 批量插入多条记录


4 . 插入另一个查询的结果


下面,老蝴蝶将会每一种情况进行详细的分析。


使用的 仍然是 yuejl 数据库, 但要将以前的表全部清空, 重新构建数据库。 用全新的表 进行演示。


  drop database yuejl;
  create database yuejl character set utf8;
  use yuejl;
    show tables;


2019111916524281.png


创建一个表 user, 里面有 id,name,sex,age, description 五个字段, id为主键自增。


  create table user(
    id int(11) primary key auto_increment,
    name varchar(20)not null,
    sex varchar(10) default '男',
    age int(3),
    description varchar(100)
  );


20191119165246831.png


一. 插入一条完整的记录


插入一条完整的记录, 可以分为两种情况, 一种是按照列顺序插入,省略列名字段(即常说的 完全不指定字段名), 一种是任意列顺序插入,值顺序与列顺序保持一致(指定所有字段名)。


一.一 指定所有字段名 插入数据


所用命令:


  insert into 表名(列名1,列名2...列名n) values(属性值1,属性值2...属性值n)


其中, 列名1,列名2…列名n 的顺序可以与表定义时列的顺序一致,也可以不一致, 但属性值1,属性值2…属性值n, 一定要与前面定义的列名1,列名2…列名n 的顺序保持完全一致。


上面的 user 表的 表定义时列的顺序为: id为第一个,name为第二个,sex为第三个,age 为第四个, description 为第五个。


一.一.一 列名与表列顺序相同时插入


  insert into user(id,name,sex,age,description) values(1,'两个蝴蝶飞','男',24,'一个快乐的程序员');


20191119165257934.png


但常常省略写成:


  insert into user values(1,'两个蝴蝶飞','男',24,'一个快乐的程序员');


一.一.二 列名与表列顺序不相同时插入


如将 sex 排到第2,age 第三, name 第四的顺序。


  insert into user(id,sex,age,name,description) values(2,'男',24,'老蝴蝶','一个快乐的程序员');


20191119165307215.png


一.一.三 关于自动增长的主键插入问题


注意,这段内容是在一.一.四操作好之后重新加入的。 数据库先执行的一.一.四的内容, 所以执行时不会报主键的问题。


现在数据库的内容是:


2019111916545852.png


id 是自动增长的, 如果插入时,插入了id的值,那么数据库中插入的值便是 传入的值。


如果不想传入,可以传入 null值或者 default 值来代替。


1 .传入 null 值:


  insert into user(id,name,sex,age,description) values(null,'精灵妹','女',24,'一个快乐的精灵');


20191119165505108.png


2 .传入 default 值:


  insert into user(id,name,sex,age,description) values(default,'精小妹','女',24,'一个快乐的精灵');


20191119165513195.png


3 .自动增长 AUTO_INCREMENT 的意义


老蝴蝶使用的数据库是 5.7.13 版本的,故创建 user表的默认引擎是 InnDB.


     1 . 如果插入了一个大的编号, 那么接下来的自动增长的编号将会改变值,并不是原先的值, 而是新插入的这个编号值+1.


如: 接下来的自动增长的值应该是 6, 如果这个时候插入一个编号是100的值。


20191119165523490.png


那么接下来的编号并不是6了,而是变成了 100+1=101 了。


insert into user(id,name,sex,age,description) values(default,'风流少爷','男',18,'一个想当好人的人');


20191119165532530.png


     2 . 自动增长的值 即 auto_increment 的值不能被回退,也不能再次使用。


如先 将 100和101 的编号去掉。 再重新插入一条记录, 那么这条记录 不是当前的最大记录+1,即6, 而是会继续原先的值进行递增,即原来的101+1=102


2019111916553970.png


     3 .插入的数据可以小于 auto_increment 的值, 如果与原来记录中的主键值不重复,就可以正常的插入, 但并不会改变 auto_increment的值。


20191119165622139.png


     4 . 无法通过命令修改 auto_increment 的值。


CREATE TABLE OR ALTER 表名 AUTO_INCREMENT=n


2019111916555483.png


这一点 不像 MyISAM 存储引擎。 MyISAM可以自动修改值。


20191119165603597.png


MyISAM修改的话,递增之后,会报主键重复的问题。


     5 . MySQL数据库在与 java 代码进行业务关联时, 插入数据不提交,或者插入数据后回滚 都会造成跳号的 问题。 只要插入数据,就会改变 auto_increment 的值。


     6 .在创建表的时候, 自动增长的列 auto_increment, 通常是主键, 会默认初始值为1.在插入数据的时候,会先将 auto_increment 与 插入的属性值进行比较比较, 如果插入的属性值是 null 或者是default, 那么就用 auto_increment的值代替属性值, 同时 auto_increment 自增1. 如果属性值不是 null和 default的话, 就判断一下 auto_increment与 插入属性值的大小。 如果 auto_increment< 插入属性值, 那么令 auto_increment=属性值, 将auto_increment的值插入进去, 同时 auto_increment 自增1. 如果 auto_increment=属性值,那么将 auto_increment的值插入进去,同时 auto_increment自增1. 如果 auto_increment> 属性值,那么判断一下,属性值是否与原先的数据重复,如果重复,抛出主键重复错误,如果不重复,将属性值插入, auto_increment保持不变。


     比较复杂, 用伪代码解释就是:


  int auto_increment=1;// 是一个与表进行关联的全量值 
  String input_num=插入属性值;
  int insert_num=0; //要插入的真正的值
  if(input_num==null||"default".equals(input_num)){
    insert_num=auto_increment;
    auto_increment++;
  }else{
    int num=Integer.parseInt(input_num);
    if(num>=auto_increment){
      auto_increment=num+1;
      insert_num=num;
    }else{
      if(num in (数据表的主键值里面)){
        throws '主键重复错误';
      }
      insert_num=auto_increment;
    }
  }
  insert 表名  id主键值为  insert_num; 
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
canal 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在进行整库同步MySQL数据到StarRocks时,遇到全量数据可以同步,但增量数据无法同步,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2天前
|
分布式计算 大数据 关系型数据库
MaxCompute产品使用问题之如何查看数据离线同步每天从MySQL抽取的数据量
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
2天前
|
Java 关系型数据库 MySQL
Mybatis入门之在基于Springboot的框架下拿到MySQL中数据
Mybatis入门之在基于Springboot的框架下拿到MySQL中数据
12 4
|
6天前
|
SQL 缓存 关系型数据库
|
2天前
|
关系型数据库 MySQL 数据库
MySQL数据库开发之多表查询数据准备及案例实操
MySQL数据库开发之多表查询数据准备及案例实操
11 1
|
5天前
|
存储 关系型数据库 MySQL
关系型数据库mysql数据文件存储
【6月更文挑战第15天】
15 4
|
5天前
|
canal 关系型数据库 MySQL
蓝易云 - 详解canal同步MySQL增量数据到ES
以上就是使用Canal同步MySQL增量数据到Elasticsearch的基本步骤。在实际操作中,可能还需要根据具体的业务需求和环境进行一些额外的配置和优化。
25 2
|
9天前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之同步MySQL数据并EP(复杂事件处理)时,编译报错,如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
10天前
|
JSON 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在使用CDAS语法同步MySQL数据到Hologres时,如果开启了字段类型宽容模式,MySQL中的JSON类型会被转换为什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
10天前
|
关系型数据库 MySQL Java
实时计算 Flink版产品使用问题之如何提高Flink从MySQL读取数据的速度并减少延迟
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。