into

Oracle MERGE INTO 详细介绍

一世执手 提交于 2019-12-16 17:45:09
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Oracle Merge into 详细介绍 /*Merge into 详细介绍 MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。 通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询, 连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。 这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。 */ /*語法: MERGE [INTO [schema .] table [t_alias] USING [schema .] { table | view | subquery } [t_alias] ON ( condition ) WHEN MATCHED THEN merge_update_clause WHEN NOT MATCHED THEN merge_insert_clause; */ 语法: MERGE INTO [your table-name] [rename your table here] USING ( [write your query here] )[rename your query-sql and using just like a table] ON ([conditional

MySQL的Replace into 与Insert into ..... on duplicate

霸气de小男生 提交于 2019-12-04 23:22:00
(1),没有key的时候,replace与insert .. on deplicate udpate相同。 (2),有key的时候,都保留主键值,并且auto_increment自动+1 不同之处:有key的时候,replace是delete老记录,而录入新的记录,所以原有的所有记录会被清除,这个时候,如果replace语句的字段不全的话,有些原有的比如例子中c字段的值会被自动填充为默认值。 而insert .. deplicate update则只执行update标记之后的sql,从表象上来看相当于一个简单的update语句。 但是实际上,根据我推测,如果是简单的update语句,auto_increment不会+1,应该也是先delete,再insert的操作,只是在insert的过程中保留除update后面字段以外的所有字段的值。 所以两者的区别只有一个, insert .. on deplicate udpate保留了所有字段的旧值,再覆盖然后一起insert进去,而replace没有保留旧值,直接删除再insert新值。 从底层执行效率上来讲,replace要比insert .. on deplicate update效率要高,但是在写replace的时候,字段要写全,防止老的字段数据被删除。 来源: oschina 链接: https://my.oschina.net

create table as及并行相关问题

拥有回忆 提交于 2019-12-04 19:44:04
工作中设计到更新多张千万级数据量的表,需要先统计相关信息,再将信息更新到表中,更新操作需要几个小时才能执行完成。 调整思路为,先统计相关信息到中间表中C,用业务表A和C联查,用create table as方式创建表B,删除A表相关索引、主外键,创建B表索引,主外键,将A表rename为备份表,将B表rename为A。 期间考虑过用Insert into select方式,比较效率后采用create as方式。create table as是ddl语句,insert into select是dml语句,insert into select每一条记录的时候都会产生undo和redo,整个过程相比create table as产生的redo和undo相当多,因此整个过程会慢也是正常的;但是create table as使用的前提是目标表的结构不存在才能使用;当有大量数据的时候不推荐使用Insert into as,因为该语句的插入的效率很慢; 最后增加并行,用create table B parallel (degree default) AS方式创建,8千万的数据可以在3分钟内执行完成,还要注意创建完表之后需要关闭该表的并行,不关闭并行可能 引起执行计划错误,查询效率出现问题。 在生产环境执行过程中发现问题:ORA-12805: parallel query server died

mysql一次更新多条不同的记录

落花浮王杯 提交于 2019-12-03 21:23:41
  最近oschina上又有朋友问到了mysql中一次更新多条不同的记录的方法,我知道的方法有两种,使用on duplicate key update语法和使用 replace into语法。   这两个语法都需要主键索引或唯一索引支持,下面举例说明。   测试用的表结构和数据 CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c1` varchar(50) NOT NULL DEFAULT '', `c2` varchar(50) NOT NULL DEFAULT '', `c3` varchar(50) NOT NULL DEFAULT '', PRIMARY KEY (`id`), UNIQUE KEY `c1` (`c1`) ) ENGINE=InnoDB AUTO_INCREMENT=125 DEFAULT CHARSET=utf8 ; insert into t values(1,2,3,4),(5,6,7,8); on duplicate key update 语法   on duplicate key update 语法的官方说明 http://docs.oracle.com/cd/E17952_01/refman-5.1-en/insert-on-duplicate.html If you

Mysql中replace into用法详细说明

只谈情不闲聊 提交于 2019-12-01 19:24:08
Replace into是Insert into的增强版。在向表中插入数据时,我们经常会遇到这样的情况:1、首先判断数据是否存在;2、如果不存在,则插入;3、如果存在,则更新。 在SQL Server中可以这样处理: if not exists (select 1 from t where id = 1) insert into t(id, update_time) values(1, getdate()) else update t set update_time = getdate() where id = 1 那么 MySQL 中如何实现这样的逻辑呢?MySQL 中有更简单的方法: replace into replace into t(id, update_time) values(1, now()); 或 replace into t(id, update_time) select 1, now(); replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先 删除 此行数据,然后插入新的数据。 2. 否则,直接插入新数据。 要注意的是: 插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据

MySQL replace into 用法

岁酱吖の 提交于 2019-12-01 19:23:32
讨人喜欢的 MySQL replace into 用法(insert into 的增强版) 在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在; 2. 如果不存在,则插入;3.如果存在,则更新。 在 SQL Server 中可以这样处理: if not exists (select 1 from t where id = 1) insert into t(id, update_time) values(1, getdate()) else update t set update_time = getdate() where id = 1 那么 MySQL 中如何实现这样的逻辑呢?别着急!MySQL 中有更简单的方法: replace into replace into t(id, update_time) values(1, now()); 或 replace into t(id, update_time) select 1, now(); replace into 跟 insert 功能类似,不同点在于: replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。 要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话, replace

常见的几个数据库insert into操作的主键返回值

て烟熏妆下的殇ゞ 提交于 2019-11-28 13:30:38
http://blog.csdn.net/axman/article/details/887918 当插入一条记录时,我们很多时候都想马当前插入的主键返回出来.作为另一个操作的条件.如果主键是 自动生成的(大多数时候是这样),那么取回主键是一种比较困难的事.可能对于一些特殊的数据库必须把 insert into和select max(key)或什么序列当前值作为一个事务的原子来操作,但很多数据库(以及数据库操作环境) 并不能为你提供事务并发控制.所以如果多人同时操作,那么select max(key)很可能就不是你刚才insert的 那条记录. 在JDBC3.0中,已经可以直接返回insert 语句的主KEY和其它值,但目前只有mysql支持.oracl和sqlserver 的JDBC都不支持这个特性.而且如果离开JAVA平台就没有这个特性了. 详细读了oacle,sqlserver,mysql的文档,对上面三种数据库找到了以下解决方案,在java和非java平台都适用: SQLServer: INSERT INTO tableName (fieldList ...) values (valueList ...) SELECT @@IDENTITY AS aliasName; 这一句相当于执行查询操作,从结果集中getXXX(aliasName);就可以获取. Oracle: