本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《
阿里云开发者社区用户服务协议
》和
《
阿里云开发者社区知识产权保护指引
》。如果您发现本社区中有涉嫌抄袭的内容,填写
侵权投诉表单
进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
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的修改
很大程度上会导致主备中断,存在容灾.