1、使用update进行数据更新
1)最简单的更新
update tablea a set a.price=1.00
2)带条件的数据更新
update tablea a set a.price = 2.00 where a.id='02'
3)两张表关联更新为固定值
update tablea a set a.price =3.00 where exits(select 1 from tableb b where a.id=b.id)
将a,b相同id的 a表的price 字段更新为 3.00
4)关联更新数据来源第二张表
update tablea a set a.price=(select price from tablec c ) where exits (select 1 from tablec c where a.id=c.id)
将a表price字段 更新为 id和c表id相同的数据
5)关联更新多个字段
update tablea a set ( a.price,a.type)=(select c.price,c.type from tablec c ) where exits (select 1 from tablec c where a.id=c.id)
更新a表的price 和 type 字段
6)使用视图方式更新
update (select a.price old,c.price as new from tablea a ,tablec c where a.id=c.id) set old=new
以上为自己了解到的Update使用方式,需要注意 a.id 和c.id需要一一对应。即c表只有一条id 与a表id对应,否则会报错
ORA-01427:"single-row subquery returns more than one row"
单行查询返回多行结果。是不能进行更新的。
2、merge 更新使用
工作中要对一个字段:次数 进行更新 表数据量在 13w+ 需要两表关联 也就是 两个 13w+ 的表进行关联。
在使用update进行更新的时候,效率问题大大降低。加上限制条件更新 100条数据还用了6-8S,所以 update并不适用。
查阅资料看到merge 更新,便学习记录。
MERGE 在SQL Server、Oracle数据库中可用,MySQL、PostgreSQL中不可用。可以同时进行更新和插入操作。执行效率要高于INSERT+UPDATE。
语法:
MERGE INTO [your table-name] [rename your table here]
USING ( [ your query ] )[rename your query-sql and using just like a table]
ON ([conditional expression ] AND [...]...)
WHEN MATHED THEN [here you can execute some update sql or something else ]
WHEN NOT MATHED THEN [execute something else here ! ]
示例
merge into tablea a ----要更新或者操作的表
using tablec c ----源表 using (select * from tablec ) c
on a.id=c.id --匹配条件
when matched then set a.price=c.price --当匹配时进行更新操作
when not matched then --不匹配进行插入操作
insert values values(c.id,c.price)
using 后不仅可以使用 表 也可以是 视图或者子查询 using (select * from tablec ) c
not matched 可以没有 就是当不匹配什么也不做。
总结:
之前说的使用update更新100行数据都需要6-8S 使用merge 更新全部数据(13W+ 与13W+ 关联)只用了10S左右。更新效率可见要比update高很多。
SQL Server 2008 开始支持 MERGE语句
-- 源表
CREATE TABLE test_from (id INT, val VARCHAR(20));
-- 目标表
CREATE TABLE test_to (id INT, val VARCHAR(20));
-- 插入源表
INSERT INTO test_from VALUES (1, 'A');
INSERT INTO test_from VALUES (2, 'B');
-- 合并 源表到目标表
MERGE test_to USING test_from
ON ( test_to.id = test_from.id ) -- 条件是 id 相同
WHEN MATCHED THEN UPDATE SET test_to.val = test_from.val -- 匹配的时候,更新
WHEN NOT MATCHED THEN INSERT VALUES(test_from.id, test_from.val) -- 源表有,目标表没有,插入
WHEN NOT MATCHED BY SOURCE THEN DELETE; -- 目标表有,源表没有,目标表该数据删除.
-- 第一次检查 目标表数据.
SELECT * FROM test_to;
id val
----------- --------------------
1 A
2 B
-- 更新源表
UPDATE test_from SET val = 'A2' WHERE id = 1;
-- 删除源表
DELETE FROM test_from WHERE id = 2;
-- 插入源表
INSERT INTO test_from VALUES (3, 'C');
-- 合并 源表到目标表
MERGE test_to USING test_from
ON ( test_to.id = test_from.id ) -- 条件是 id 相同
WHEN MATCHED THEN UPDATE SET test_to.val = test_from.val -- 匹配的时候,更新
WHEN NOT MATCHED THEN INSERT VALUES(test_from.id, test_from.val) -- 源表有,目标表没有,插入
WHEN NOT MATCHED BY SOURCE THEN DELETE; -- 目标表有,源表没有,目标表该数据删除.
-- 再次检查 目标表数据.
SELECT * FROM test_to;
id val
----------- --------------------
1 A2
3 C
Merge-数据库风格的合并
数据的合并(merge)和连接(join)是我们在数据分析和挖掘中不可或缺的,是通过一个或一个以上的键连接的。pandas的合并(merge)的的绝大功能和数据库操作类似的。具有如下参数:
pd.merge(left, right, how=’inner’, on=None, left_on=None, right_on=None, left_index=False,right_index=False, sort=False, suffixes=(‘_x’, ‘_y’), copy=True, indicator=False, validate=None)
各个参数的含义:
left、right:左右连接对象
how:连接方式,共有’inner’,’left’,right’,’outer’
on:根据连接的键
left_on、right_on:在连接的键名不同的情况下使用,left_on传入左对象的键,right_on传入右对象的键
left_index、right_index:设置索引是否作为连接的键,通常 left_on=??和right_index=True, right_on=??和left_index=True,或者left_index=True和right_index=True
sort:对连接后的结果是否排序,当数据巨大的时候为了追求效率可以设置为False
suffixes:对于不作为键的同名列,在其列名后添加的后缀
copy:将左右对象的内容复制过来,默认为True
---------------------
MERGE语句是SQL语句的一种。在SQL Server、Oracle数据库中可用,MySQL、PostgreSQL中不可用。MERGE是Oracle9i新增的语法,用来合并
UPDATE和INSERT语句。通过MERGE语句,根据一张表(原数据表,source table)或子查询的连接条件对另外一张(目标表,target table)表
进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT
+UPDATE.具体来说,MERGE语句会检查原数据表记录和目标表记录。如果记录在原数据表和目标表中均存在,则目标表中的记录将被原数据表中的
记录所更新(执行Update操作);如果目标表中不存在的某(些)记录,在原数据表中存在,则原数据表的这(些)记录将被插入到目标表中(
执行Insert操作)。在Oracle 10g之前,merge语句支持匹配更新和不匹配插入两种简单的用法,在10g中Oracle对merge语句做了增强,增加了
条件选项和DELETE操作。
Merge语法
MERGE [hint] 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;
代码及说明
1.MERGE INTO test T1
2.USING (SELECT OWNER, OBJECT_NAME, MAX(ID) ID FROM T GROUP BY OWNER, OBJECT_NAME) T
3.ON (T,OWNER = T1,OWNER AND T.OBJECT_NAME = T1,TABLE_NAME)
4.WHEN MATCHED THEN UPDATE SET T1,ID = T,ID
5.WHEN NOT MATCHED THEN INSERT VALUES (T,ID, T,OWNER, T,OBJECT_NAME);
第一行 命名目标表并给别名T1
第二行 using子句提供merge操作的数据源,命名T
第三行 on子句指定合并的条件
第四行 when matched then 子句判定条件符合则对表T1做什么改变(或删除)
第五行 when not matched then 子句判断条件不符合则插入的操作
上面为数据库中merge,下面为hibernate中merge和update的区别
1. 数据库记录已存在,更改person的name为一个新的name。
merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
Hibernate: update person set name=? where id=?
update方法打印出的日志如下:
Hibernate: update person set name=? where id=?
2. 数据库记录已存在,更改person的name和数据库里对应id记录的name一样的值。
merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
此处相对于第一种情形少了update的动作
update方法打印出的日志如下:
Hibernate: update person set name=? where id=?
3. 数据库记录不存在时,也就是你传的实体bean的ID在数据库没有对应的记录。
merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
Hibernate: insert into person (name) values (?)
如果没有对应的记录,merge会把该记录当作新的记录来插入。此处我很疑惑,因为我传得person实体对象里写明了id值的,它为什么还会做插入的动作呢?
Oracle数据库用户数据完整备份与恢复
使用PLSQL-Developer工具可以快速便捷地完成Oracle数据库用户.表的备份恢复. Oracle数据库用户数据完整备份与恢复 1. 备份 1.1 PL/SQL->工具->导 ...
oracle数据库删除数据Delete语句和Truncate语句的对比
oracle数据库删除数据Delete语句和Truncate语句的对比 当表中的数据不需要时,则应该删除该数据并释放所占用的空间,删除表中的数据可以使用Delete语句或者Truncate语句,下面分 ...
R语言中的横向数据合并merge及纵向数据合并rbind的使用
R语言中的横向数据合并merge及纵向数据合并rbind的使用 我们经常会遇到两个数据框拥有相同的时间或观测值,但这些列却不尽相同.处理的办法就是使用merge(x, y ,by.x = ,by.y ...
spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置
spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置 jdbc.properties 文件信息如下: ---------- ...
C#连接Oracle数据库查询数据
C#连接Oracle数据库可以实现许多我们需要的功能,下面介绍的是C#连接Oracle数据库查询数据的方法,如果您对C#连接Oracle数据库方面感兴趣的话,不妨一看. using System; u ...
使用mybatis向oracle数据库插入数据异常
遇到了使用mybatis向oracle数据库插入数据异常的问题, 具体的报错如下:org.springframework.jdbc.UncategorizedSQLException: ### Err ...
Delphi - cxGrid连接Oracle数据库 实现数据的增删改查
cxGrid连接Oracle数据库 实现数据的增删改查 cxGrid连接Oracle数据库 1:通过OraSession连接数据库.OraDataSet实现OraSession和OraDataSour ...
Oracle数据库之间数据同步
这段时间负责某个项目开发的数据库管理工作,这个项目中开发库与测试数据库分离,其中某些系统表数据与基础资料数据经常需要进行同步,为方便完成指定数据表的同步操作,可以采用dblink与merge结合的方法 ...
Oracle数据库,数据的增、删、改、查
oracle数据库中,数据的增.删.改.查,通过SQL语句实现 SQL:结构化查询语言: 特点:不区分大小写:字符串用单引号引起来:语句结束用分号表示结束: 行注释,在语句的最前面加"--& ...
随机推荐
Web项目学习
首先配好jdk,tomcat,下载eclipse,下载bootstrap模板,进行JDBC连接 创建项目 打开Eclipse,选择左上角的File->NEW->最后一个other,选择如下 ...
Zygote进程【2】——Zygote的分裂
在Zygote的诞生一文中init进程是如何一步步创建Zygote进程的,也了解了Zygote的进程的作用.Zygote进程的诞生对于整个Java世界可以说有着"开天辟地"的作用, ...
【练习】trace文本重建控制文件
这个小练习是针对控制文件全部丢失后怎么能快速的重建一个控制文件,快速的起库 1.备份控制文件到trace下 SQL> alter database backup controlfile to t ...
hdu1565 网络流或状态压缩DP
对于网络流有一个定理: 最小点权覆盖集=最大网络流: 最大点权独立集=总权值-最小点权覆盖集: 网络流解法代码如下: #include #include
bzoj 3277
十分之恶心的后缀自动机 (其实是水题,但是我太弱了...) 首先,有一个预备知识:bzoj 2780https://blog.csdn.net/lleozhang/article/details/89 ...
swagger 参数
http://www.mamicode.com/info-detail-2213514.html
3.3 PXC Strict Mode
摘要: 出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该 ...
MIME protocol 说明
按照 自己create了 emali, 其中jpg 和wav文件格式过大,删除了写内容 From redhat@diego.com Mon Nov 17 0 ...
实践jQuery Easyui后本地化有感
这个星期在忙着easyui的例子中的大部分功能的本地化.一开始给我的感觉就是把jquery easyui中的每个demo的代码粘贴复制一遍. 可是,真正在做的过程中,我才发现,我错了. 在仿写easy ...
BZOJ3524 [Poi2014]Couriers 【主席树】
题目 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入格式 第一 ...