MySQL插入数据(六)上

简介: 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; 
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
7月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
5月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
289 0
|
4月前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
380 10
|
5月前
|
SQL 存储 缓存
MySQL 如何高效可靠处理持久化数据
本文详细解析了 MySQL 的 SQL 执行流程、crash-safe 机制及性能优化策略。内容涵盖连接器、分析器、优化器、执行器与存储引擎的工作原理,深入探讨 redolog 与 binlog 的两阶段提交机制,并分析日志策略、组提交、脏页刷盘等关键性能优化手段,帮助提升数据库稳定性与执行效率。
148 0
|
8月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
386 28
|
7月前
|
存储 SQL 缓存
mysql数据引擎有哪些
MySQL 提供了多种存储引擎,每种引擎都有其独特的特点和适用场景。以下是一些常见的 MySQL 存储引擎及其特点:
207 0
|
10月前
|
Java 关系型数据库 MySQL
SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动
通过详细的步骤和示例代码,您可以在 SpringBoot 项目中成功集成 Flink CDC,并实时追踪 MySQL 数据库的变动。
2505 45
|
9月前
|
存储 SQL 关系型数据库
【YashanDB知识库】MySQL迁移至崖山char类型数据自动补空格问题
**简介**:在MySQL迁移到崖山环境时,若字段类型为char(2),而应用存储的数据仅为&#39;0&#39;或&#39;1&#39;,查询时崖山会自动补空格。原因是mysql的sql_mode可能启用了PAD_CHAR_TO_FULL_LENGTH模式,导致保留CHAR类型尾随空格。解决方法是与应用确认数据需求,可将崖山环境中的char类型改为varchar类型以规避补空格问题,适用于所有版本。
|
9月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
本文探讨了在使用YMP 23.2.1.3迁移MySQL Server字符集为latin1的中文数据至YashanDB时出现乱码的问题。问题根源在于MySQL latin1字符集存放的是实际utf8编码的数据,而YMP尚未支持此类场景。文章提供了两种解决方法:一是通过DBeaver直接迁移表数据;二是将MySQL表数据转换为Insert语句后手动插入YashanDB。同时指出,这两种方法适合单张表迁移,多表迁移可能存在兼容性问题,建议对问题表单独处理。
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
|
9月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,

推荐镜像

更多