mysql插入(mysql将一张表的数据插到另一张表)

本篇文章给大家谈谈mysql插入,以及mysql将一张表的数据插到另一张表对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

怎么在mysql中插入表记录?

方法如下:

1、首先打开Mysql命令行编辑器,连接Mysql数据库;

2、使用所要操作的数据库,先显示一下数据库中的表;

3、显示一下表结构,了解一下表中的列;

4、向表插入数据,insert into 表名 (列名) values (值);

5、查询表可以看到所插入的数据,select * from 表名;

6、可以再插入一个数据,显示一下。

扩展资料:

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。

MySQL是一种关系数据库管理系统,关系数据库将数据保存在盯野不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。

由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。

与其他的大型数据库,例如 Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于 MySQL是开放源码软件,因此可以大大降低总体拥有成本。

Linux作为操作系统,Apache 或Nginx作为 Web 服务器,MySQL 作为数据库,PHP/Perl/Python作为服务器端脚本解释器。由于这四个软件都是免费或开放源码软件(FLOSS),因此使用这种方式不用花一分钱(除开人工成本)就可以建立起一个稳定、免费的网站系统,被业界称为“LAMP“或“LNMP”组合。

MyISAMMySQL 5.0 之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务

InnoDB事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5.5 起成为默认数据库引擎

BDB源 自 Berkeley DB,事务型数据库的另一种选择,支持Commit 和Rollback 等其他事务特性

Memory所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在 MySQL 重新启动时丢失

Merge将一定数量的 MyISAM 表联合而成一个整体,在超大规模数据存储时很有用

Archive非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive 拥有高效的插入速度,但其对查询的支持相对较差

Federated将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用

Cluster/NDB高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全源搭性。适合数据量大,安全和性能要求高的应用

CSV: 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个 .csv 文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV 存储引擎不支持索引。

BlackHole:黑洞引擎,写入的任何数据都会消失,一般用于记录 binlog 做复制的中继

EXAMPLE 存储引擎是一个不做任何事情的存根凯裂喊引擎。它的目的是作为 MySQL 源代码中的一个例子,用来演示如何开始编写一个新存储引擎。同样,它的主要兴趣是对开发者。EXAMPLE 存储引擎不支持编索引。

另外,MySQL 的存储引擎接口定义良好。有兴趣的开发者可以通过阅读文档编写自己的存储引擎。

参考资料来源:百度百科:mySQL

想在mysql数据库中的表中插入一列,怎么做?

传统情况

我们先回顾一下,在没有 "立刻加列" 功能时,加列操作是怎么完成的。我们也借此来熟悉一下本期的图例:

当进行 加列操作 时,所有的数据行 都必须要 增加一段数据(图中的 列 4 数据)

如上一期图解所讲,当改变数据行的长度,就需要 重建表空间(图中灰蓝的部分为发生变更的部分)

数据字典中的列定义也会被更新

以上操作的问题在于 每次加列 操作都需要重建表空间,这就需要大量 IO以及大量的时间

立刻加列

"立刻加列" 的过程如下图:

请点击输入图片描述

请点击输入图片描述

"立刻加列" 时,只会变更数据字典中的内容,包括:

在列定义中增加 新列的定义

增加 新列的默认值

"立刻加列" 后,当要读取表中的数据时:

由于 "立刻加列" 没有 变更行数据,读取的行数据只有 3 列

MySQL 会将 新增的第 4 列的默认值,追加到 读取的数据后

以上过程描述了 如何读取 在 "立刻加列" 之前写入的数据,其实质是:在读取数据的过程中,"伪造" 了一个新列出来

那么如何读取 在 "立刻加列" 之后 写入的数据呢 ? 过程如下图:

当读取 行 4 时:

请点击输入图片描述

请点击输入图片描述

通过判断 数据行的头信息中的instant 标志位,可以知道该行的格式是 "新格式":该行头信息后有一个新字段 "列数"

通过读取 数据行的 "列数" 字段,可以知道 该行数据中多少列有 "真实" 的数据,从而按列数读取数据

通过上图可以看到:读取 在"立刻加列" 前/后写入的数据是不同的流程

通过以上的讨论,我们可以总结 "立刻加列" 之所以高效的原因是:

在执行 "立刻加列" 时,不变更数据行的结构

读取 "旧" 数据时,"伪造" 新增的列,使结果正确

写入 "新" 数据时,使用了新的数据格式(增加了instant标志位 和 "列数" 字段),以区分新旧数据

读取 "新" 数据时,可以如实读取数据

那么 我们是否能一直 "伪造" 下去 ? "伪造" 何时会被拆颤厅搭穿 ?

考虑以下场景:

用 "立刻加列" 增加列 A

写入数据行 1

用 "立刻加列" 增加列 B

写入数据行 2

删除列 B

我们推测一下 "删除列 B" 的最小代价:需要修改 数据行中的instant标志位或 "列数" 字段,这至少会影响到 "立刻加列" 之后写入的数据行,成本类似于重建数据

从以上推测可知:当出现 与 "立刻加列" 操作不兼容 的 DDL 操作时,数据表需要进行重建,如下图所示:

请点击输入图片描述

请点击输入图片描述

扩展思考题:是否能设计其他的数据格式,取代instant标志位和 "列数" 字段,使得 加列/删列 操作都能 "立刻完成" ?(提示:考虑 加列 - 删列 - 再加列 的情况)

使用限制

在了解原理之后,我们来看看 "立刻加列" 的使用限制,就很容易能理解其中的前两项:

"立刻加列" 的加列位置只能在表的最后,而不能加在其他列之间

在元数据中,只记录了 数据行 应有多少列,而没有记录 这些列 应出现的位置。所以无法实现指定列的位置

"立刻加列" 不能添加主键列

加列 不能涉及聚簇索引的变更,否则就变成了 "重建" 操作,不是 "立刻" 完成了

"立刻加列"不支持压缩的表格式

按照 WL 的说法:"COMPRESSED is no need to supported"(没必要支持不怎么用的格式)

总结回顾

我们总结一下上面的讨论:

"立刻加列" 之所以高效的原因是:

在执行 "立刻加列" 时,不变更数据行的结构

读取 "旧" 数据时,"伪造" 新增的列,使结果正确

写入 "新" 数据时,使茄拿用了新的数据格式 (增加了 instant 标志位 和 "列数" 字段),以区分新旧数据

读取 "新" 数据时,可以如实伏核读取数据

"立刻加列" 的 "伪造" 手法,不能一直维持下去。当发生 与 "立刻加列" 操作不兼容 的 DDL 时,表数据就会发生重建

回到之前遗留的两个问题:

"立刻加列" 是如何工作的 ?

我们已经解答了这个问题

所谓 "立刻加列" 是否完全不影响业务,是否是真正的 "立刻" 完成 ?

可以看到:就算是 "立刻加列",也需要变更 数据字典,那么 该上的锁还是逃不掉的。也就是说 这里的 "立刻" 指的是 "不变更数据行的结构",而并非指 "零成本地完成任务"

[img]

MYSQL中执行插入操作的关键字是

一、关键字执行顺序

1、查询中用到的关键词主要包含六个,并且他们的顺序依次为 :

select--from--where--group by--having--order by 其中select和from是必须的,其他关键词是可选的。

这六个关键词的执行顺序,与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行

from--where--group by--having--select--order by。

注意:虽然select在having后执行,但是mysql中仍然可以在having中使用select语句定义的别名。

原镇携因分析:mysql在查询的时候会产生一个临时表,所有的字段名称(别名)在临时表中已经产生,产生了临时表之后才会进行having操作。也就是说mysql内部有一定的解析顺序,解析顺序select优先于having。在这里我个人认为是mysql可能没有将这一点做规范。Oracle中having无法使用select语句内的别名。

2、insert into 和replace into和merge into

insert into是mysql的基本插入语句。replace into 是mysql中的代替插入语句,可以理解为insert into的升级版。replace into在执行的时候,首先会根据指定的主键或者唯一索引判断当前表中是否存在指定的主键或索引,如果主键或唯一索引已经存在,则先将对应的索引的数据删除,然后在索引位置插入replace into中包含的数据。如果主键和唯一索引没有存在,则直接在索引位置插入replace into中包含的数据。merge into 是oracle数据库中的代替插入语句。实现方式和replace into类似。执行效率:如果指定索引位置没有数据,insert into和replace into执行效率相差无几,二者效率相同。如果指定位置索引已经存在,insert into语句不能正常执行,replace into语句可以正常执行。注意:虽然replace into比较好使用,但是也存在一定风险:replace每次要重新分配自增id;replace中执行delete时, 在有外键的情况下会很麻烦;如果delete时定义的有触发器, 则会被执行;副作用也会被传播到replica slave.推荐使用INSERT INTO … ON DUPLICATE KEY UPDATEON DUPLICATE KEY UPDATE是mysql特有的一个sql关键字,只能在mysql中使用。

在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新;如果插入的行数据与现有表中记录的唯一索引或者主键不重复,则执行新纪录插入操作。

比如有这样一张表:

create table func(id int primary key,count int,birthday date);

insert into func values(1,1,'1990-09-09');--插入一条数据

insert into func values(1,1,'1990-09-09') on duplicate key update count = count+1;--表中有数据,删除原表数据,将新数据插入。

提示两行受到影响,说明先执行的删除操作,然后插入新的数据亏锋。

观察到没有任何新数据插入,count字段被更新。(count字段更新是因为刚刚的插销旅晌入语句中书写了update count = count+1;)

如果不希望任何字段更新,可以写成如下格式:

insert into func values(1,1,'1990-09-09') on duplicate key update count = values(count);--再次执行,没有新数据插入到数据库中。

二、mysql内置函数

内置函数众多,不需要每一个都掌握,熟练掌握几个在以后使用即可。可以查看mysql官方文档学习内置函数。

三、其它注意事项

1、在已经存在的表中添加外键。(仅作为了解内容)

alter table tb_name add constraint fk_name foreign key (tb_name.id) references tb_stu(id);

例如:alter table emp add constraint forkey foreign key(dept_id) references dept(id);

该语句是在 tb_name表上添加一个外键约束,引用 tb_stu的主键,fk_name是约束的名字。

删除约束:alter table tb_name drop constraint fk_name ;

2、外键的使用情景:

在不要求吞吐速度而对数据的正确性和安全性要求较高时,推荐使用外键。

如果面对高吞吐量,要求优先保证读取效率时,则不推荐使用外键。

3、删除的时候使用别名:

原句:delete from employee where id = 1;

别名:delete e from employee as e where id =1;

六、MySQL数据库之数据插入(insert into)

本节介绍数据的插入,复制数据到另一张表的Sql语法,主要语法有: insert into,insert into select,select into from 等用法,下面将一一为大家详细说明:

以下面两张表进行sql脚本说明

insert into有两种语法,分别如下:

语法1:INSERT INTO table_name VALUES (value1,value2,value3,...);   --这种形式无需指定要插入数据的列名,只需提供被插入的值即可:

语法2:INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...);    --这种形式需指定要插入数据的列名,插入的值需要和列名一一对应:

eg:insert into customer values('1006','14006','王欣欣','27','深圳市');  --向表customer插入一条数据

eg:insert into customer values('1007','14007','孟一凡','27','');             --向表customer插入一条数据,最后一个值不填表示迟羡对应的值为空,非必填项可以不用插入值

eg:insert into customer (cus_id,cus_no,cus_name,cus_age,cus_adds) values('1008','14008','孔凡','26','广州市');      --向表customer插入一条数据,插入的值与列名一一对应

详解:insert into select    --表示从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。

语法1:INSERT INTO table_name2 SELECT  * FROM table_name1;  --表示将表table_name1中复制所有列的数据插入到已存在的表table_name2中。被插入数据的表为table_name2,切记不要记混了。

eg:insert into customer select * from asett   --将表asett中所有列的数指旦世据插入到表customer中

语法2:INSERT INTO table_name2 (column_name(s)) SELECT column_name(s) FROM  table_name1;  --指定需要复制的列,只复制制定的列插入到另一个已存在的表table_name2中:

eg:insert into customer (cus_id,cus_no) select ast_id,ast_no from asett   --将表asett中列ast_id和ast_no的数据插入到表customer对应的cus_id,cus_no列中

详解:从一个表复制数据,然后把数据插入到另一个新表中。

语法1:SELECT * INTO newtable [IN externaldb] FROM table1;                               --复制所有的列插入到新表中:

eg:select * into customer from asett     --将asett表中数据插入到customer中,被插入的 表唯肢customer不存在

eg:select * into customer from asett where ast_id = '1008'    --只复制表asett中ast_id=1008的数据插入到customer中,被插入的 表customer不存在

语法2:SELECT column_name(s) INTO newtable [IN externaldb] FROM table1;   --只复制指定的列插入到新表中:

eg:select ast_id,ast_no into customer from asett  --将asett表中列ast_id,ast_no数据插入到customer中,被插入的 表customer不存在

区别1:insert into customer select * from asett where ast_id='1009' --插入一行,要求表customer 必须存在

区别2:select * into customer  from asett  where ast_id='1009' --也是插入一行,要求表customer  不存在

区别3:select into from :将查询出来的数据复制到一张新表中保存,表结构与查询结构一致。

区别4:insert into select :为已经存在的表批量添加新数据。

MySQL 常用插入语法总结

当MySQL表字段设置 unique key 或者 primary key 时,被约束的字段就必须是唯一的。新插入数据直接使用 insert into ,如果出现唯一性冲突,就会毕则抛出异常。我们应该根据需求选择合适的插入语句。

为了演示,我们先新建一张user表,SQL语句如下:

当插入数据时,如果唯一性校验出现重复问题,则报错;

如果没有重复性问题,则执行插入操作。

简单总结:重复则直接报错,sql 语句不执行,不重复则插入。

示例

执行结果

当插入数据时,如果唯一性校验出现重复问题,则忽略错误,只以警告形式返回,不执行此SQL语句;

如果没有重复性问题,则执行插入操作。

简单总结:重复则忽略,sql 语句不执行,不重复则插入。

示例

执行结果

当插入数据时,如果唯一性校验出现重复问题,则在原有记录基础上,更新指定字段内容,其它字段内容保留;

如果没有重复性问题,则执行插入操作。

简单总结:重复则更新指定字段,不重复则插入。

示例

执行结果

表记录, mobile_phone_number 从 '13800000077' 更新为 '13800000088' 了, update_time 也从 NULL 更新为有值了,但是 id 没有变:

replace into表示插入替换数据,当插入数据时,如果唯一性校验出现重复问题,宏首删除旧记录,插入新记录;

如果没有重复性问题,则执行插入操作,效果和insert into是一样的。

简单总结:重复则先删除再插入新记录,不重复则插入

示例

执行结果

表记录, id 和 mobile_phone_number 变了, update_time 变为了字段默认值 NULL :

replace into 执行的逻辑:

示例一

示例一 insert into ... on deplicate key update 操作在 binlog 中记录为:

示例二

示例蔽数数二 replace into 操作在binlog中记录为:

从示例可以看出,使用 replace into 会有以下问题:

执行结果

因为全部列都是指定的值,所以,相当于所有字段全部更新了一次。

binlog 中的记录:

如果出现重复异常,希望捕获异常,则使用 insert into ;

如果出现重复异常,希望保存旧纪录,忽略新纪录,则使用 insert ignore into ;

如果出现重复异常,希望更新指定字段,则使用 insert into … on duplicate key update ;

如果出现重复异常,希望删除旧记录,插入新记录,则使用 replace into 。

mysql笔记(10)-数据的插入和更新(insert/update/case)

常见的插入方式有以下几种:

这种方式每次只能插入一行

且set从句内的values不能全部为空

这种方式可以一次性插入多行

不同行之间的数据要 用逗号进行分隔

这纤拦种方式用于替换表中的某一行

若新插入记录的主码已经存在于表中,则用悔竖让新记录替换旧记录

若新插入记录的主码不在表中,则直接插入新记录

普通的update语句写法如下:

例如:在instructor(教师信息)表中

我们想更新 ID为10101的教师的工资为70000

对于更复杂的数据更新 我们可以添碧局加 case-when从句

从而实现对数据的分类更新

例如:在instructor(教师信息)表中 对所有教师进行涨薪

对工资小于等于100000的涨薪5%,其他人涨薪3%

关于mysql插入和mysql将一张表的数据插到另一张表的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表