本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

1.INSERT INTO SELECT语句

语句形式为: Insert into Table2(field1,field2,...) select value1,value2,... from Table1

要求目标表Table2必须存在 ,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,

还可以插入常量

2.SELECT INTO FROM语句

语句形式为: SELECT vale1, value2 into Table2 from Table1

要求目标表Table2不存在 ,因为在插入时会自动创建表Table2,

并将Table1中指定字段数据复制到Table2中

如何在 mysql 从多个表中组合字段然后插入到一个新表中,通过一条 sql 语句实现。具体情形是:有三张表 a b c ,现在需要从表 b 和表 c 中分别查几个字段的值插入到表 a 中对应的字段。对于这种情况,我们可以使用如下的语句来实现:

当然,上面的语句比较适合两个表的数据互插,如果多个表就不适应了。 对于多个表,我们可以先将需要查询的字段 join 起来,然后组成一个视图后再 select from 就可以了

1.             INSERT INTO a(field1,field2) SELECT * FROM(SELECT f1,f2 FROM b JOIN c) AS tb

其中 f1 是表 b 的字段, f2 是表 c 的字段,通过 join 查询就将分别来自表 b 和表 c 的字段进行了组合,然后再通过 select 嵌套查询插入到表 a 中,这样就满足了我们这个场景了,如果需要不止 2 个表, 那么可以多个 join 的形式来组合字段。需要注意的是嵌套查询部分最后一定要有设置表别名 ,如下:

1.             SELECT * FROM(SELECT f1,f2 FROM b JOIN c) AS tb

即最后的 as tb 是必须的(当然 tb 这个名称可以随意取),即指定一个别名 ,否则在 mysql 中会报如下错误:

如果列清单和VALUES清单均为空清单,则INSERT会创建一个行,每个列都被设置为默认值:  INSERT INTO tbl_name () VALUES(); 假设worker表只有name和email,插入一条数据 批量插入多条数据 给出要赋值的那个列,然后再列出值的插入数据 insert into worker (name) values (‘tom’); insert into worker (name) values (‘tom’), (‘paul’); 使用set插入数据 insert into worker set name=’tom’;

在 SET 子句中未命名的行都赋予一个缺省值,使用这种形式的 INSERT 语句不能插入多行。

一个expression可以引用在一个值表先前设置的任何列,例如

--但不能这样
INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);

使用INSERT…SELECT语句插入从其他表选择的行

insert into tbl_name1(col1,col2) select col3,col4 from tbl_name2;
--如果每一列都有数据
insert into tbl_name1 select col3,col4 from tbl_name2;

查询不能包含一个ORDER BY子句,而且 INSERT语句的目的表不能出现在SELECT查询部分的FROM子句.

ON DUPLICATE KEY UPDATE

如果您指定了 ON DUPLICATE KEY UPDATE ,并且插入行后会导致在一个 UNIQUE 索引或 PRIMARY KEY 中出现重复值,则执行旧行 UPDATE

--假设a,b为唯一索引,表table没有1,2这样的行是正常插入数据,冲突时,更新c列的值INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=3;--或者是INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=values(c);--引用其他列更新冲突的行INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

向一个已定义为 NOT NULL 的列中插入 NULL 。对于一个多行 INSERT 语句或 INSERT INTO...SELECT 语句,根据列数据的类型,列被设置为隐含的默认值。对于数字类型,默认值为 0 ;对于字符串类型,默认值为空字符串 ( '' ) ;对于日期和时间类型,默认值为“ zero ”值。

INSERT INTO...SELECT的ON DUPLICATE KEY UPDATE

insert into tbl_name1(a,b,c) 
  select col1,col2,col3 from tbl_name2 
ON DUPLICATE KEY UPDATE c=values(c);

INSERT DELAYED

如果您的客户端不能等待 INSERT 完成,则这个选项是非常有用的, 当一个客户端使用 INSERT DELAYED 时,会立刻从服务器处得到一个确定。并且行被排入队列,当表没有被其它线程使用时,此行被插入。

使用 INSERT DELAYED 的另一个重要的好处是,来自许多客户端的插入被集中在一起,并被编写入一个块。这比执行许多独立的插入要快很多。

INSERT DELAYED INTO worker (name) values (‘tom’), (‘paul’);

使用 DELAYED 时有一些限制:

INSERT DELAYED仅适用于MyISAM, MEMORY和ARCHIVE表。 对于MyISAM表,如果在数据文件的中间没有空闲的块,则支持同时采用SELECT和INSERT语句。在这些情况下,基本不需要对MyISAM使用INSERT DELAYED。

INSERT DELAYED 应该仅用于指定值清单的 INSERT 语句。服务器忽略用于 INSERT DELAYED...SELECT 语句的 DELAYED和 INSERT DELAYED...ON DUPLICATE UPDATE 语句的 DELAYED

因为在行被插入前,语句立刻返回,所以您不能使用 LAST_INSERT_ID() 来获取 AUTO_INCREMENT 值。 AUTO_INCREMENT 值可能由语句生成。

对于 SELECT 语句, DELAYED 行不可见,直到这些行确实被插入了为止。

DELAYED 在从属复制服务器中被忽略了,因为 DELAYED 不会在从属服务器中产生与主服务器不一样的数据。

MySQL的replace函数替换字符串语句的用法
UPDATE zs_goods SET goods_name=REPLACE(goods_name, '礼盒', '替换之后字符串'); zs_goods表名字,goods_name要处理的字段的名字,实现goods_name字段里面所有的字符串'礼盒'替换成 '替换之后字符串'。 Oracle MySQL相关工具replace操作实现方式区别
本文列举MySQL、Oracle、常用数据导入工具碰到主键冲突、唯一约束、以及其他对重复数据、已有数据的处理区别,并介绍MySQL、Oracle replace相关语句实现区别。 由此可见在实际使用不同数据库过程中,还是有许多差别,需要大家细心留意。
如果业务逻辑强依赖自增ID,绝对不要用replace,普通环境也不建议这样用,因为会导致主键的重新组织 当存在pk冲突的时候是先delete再insert 当存在uk冲突的时候是直接update,update操作不会涉及到auto_increment的修改 很大程度上会导致主备中断,存在容灾.