认识oracle的update更新
这两天给新同事安排了一个工作,即做一个update 的级联更新,在实际操作中发现了一个问题。就是对于oracle的更新的语法,大部分人尤其是学过SqlServer的人在使用oracle的时候对于oracle的更新会有许多的疑问。就此记下,以便日后查阅
update a set a.col1 = (select b.col1 from b where b.col2 = a.col2)
where exists
(select * from b where a.col2 = b.col2)
/**oracle与sqlserver更新update的用法有不同,oracle是怎么处理的呢
update a set a.col1=100 将所有行全部的特定列col1更新为特定值
update a set a.col1=100 where a.col2<10 将满足col2条件的行的col1列的值更新为特定的值
update a set a.col1=a.col1+a.col2 where a.col2<10 同一个表中的简单计算更新
update a set a.col1=(select b.col1 from b where a.col2=b.col2)
where exists(select * from b where a.col2=b.col2) 级联更新,将满足a.col2=b.col2的行的a.col1更新为对应的
b.col1的值。当且仅当a=b时可以将where条件去掉。这个更新还可以这样理解:
update a set a.col1=(select b.col1 from b where a.col2=b.col2)表示对于a中所有行满足a.col2=b.col2
的进行更新,不满足条件的也更新,只不过找不到对应的值,只能将空值赋之,如果此时a.col1不允许为空那么会报插入空值错误。
所以只有加上where条件,才能将a.col2<>b.col2的那些在a中的数据得以幸存(不被更新为空)。
oracle的INSERT、UPDATE、MERGE
ORACLE 2009-12-21 08:40:55 阅读68 评论0 字号:大中小 订阅
CREATE TABLE COURSE_NEW AS SELECT * FROM COURSE;
/*清空COURSE_NEW表中的所有记录*/
TRUNCATE TABLE COURSE_NEW;
/*往COURSE_NEW表中增加以下记录:
NO COURSE_NAME
A001 ORACLE数据库管理
A002 SQLSERVER安全指南
A003 Hibernate全攻略
A004 .NET
*/
INSERT INTO COURSE_NEW(NO,COURSE_NAME)
SELECT 'A001','ORACLE数据库管理' FROM DUAL
UNION
SELECT 'A002','SQLSERVER安全指南' FROM DUAL
UNION
SELECT 'A003','Hibernate全攻略' FROM DUAL
UNION
SELECT 'A004','.NET' FROM DUAL;
COMMIT;
/*根据COURSE表中的NO字段,用COURSE_NEW更新COURSE表*/
UPDATE (SELECT /*+ BYPASS_UJVC */ A.NO,A.COURSE_NAME,B.NO AS BNO,B.COURSE_NAME AS BNAME
FROM COURSE A,COURSE_NEW B
WHERE A.NO=B.NO)
SET NO=BNO,COURSE_NAME=BNAME
COMMIT;
/*分别使用INSERT/UPDATE和MERGE命令实现,用COURSE_NEW更新COURSE表中的记录,如果存在,则更新,不存在则INSERT*/
--用MERGE实现如下:
INSERT INTO COURSE_NEW(NO,COURSE_NAME) --为了便于操作,先在COURSE_NEW中插入一条记录
SELECT 'A005','HCNE网络工程师' FROM DUAL;
COMMIT;
MERGE INTO COURSE A
USING COURSE_NEW B ON(A.NO=B.NO)
WHEN MATCHED THEN
UPDATE SET A.COURSE_NAME=B.COURSE_NAME
WHEN NOT MATCHED THEN
INSERT(A.NO,A.COURSE_NAME)
VALUES(B.NO,B.COURSE_NAME);
COMMIT;
--用INSERT/UPDATE实现如下
INSERT INTO COURSE_NEW(NO,COURSE_NAME)--为了便于操作,再在COURSE_NEW中插入一条记录
SELECT 'A006','CCNA网络工程师' FROM DUAL;
COMMIT;
--利用UPDATE对于编号相同的字段进行更新
UPDATE COURSE A SET(NO,COURSE_NAME)=
(SELECT B.NO,B.COURSE_NAME
FROM COURSE_NEW B
WHERE A.NO=B.NO )
WHERE EXISTS
(SELECT 1 FROM COURSE_NEW B
WHERE A.NO=B.NO);
COMMIT;
--利用INSERT对于原表中没有的进行添加
INSERT INTO COURSE
SELECT * FROM COURSE_NEW A
WHERE NOT EXISTS(SELECT 1 FROM COURSE B WHERE A.NO=B.NO);
COMMIT;
/*用一组语句代替对实现对全表的更新操作*/
--先用COURSE_TEST记录COURSE表的状态,以便在删除COURSE之后记录相关字段
CREATE TABLE COURSE_TEST AS SELECT * FROM COURSE WHERE ROWNUM<1;
INSERT /*+ APPEND */ INTO COURSE_TEST
SELECT * FROM COURSE WHERE ROWNUM<5;
COMMIT;
--删除COURSE表
TRUNCATE TABLE COURSE;
--更新COURSE表
INSERT /*+APPEND*/ INTO COURSE
SELECT A.NO,A.COURSE_NAME FROM COURSE_NEW A,COURSE_TEST B WHERE A.NO=B.NO;
COMMIT;
认识oracle的update更新相关推荐
- Oracle使用游标更新数据 Oracle游标之select for update和where current of 语句
Oracle使用游标更新数据 2016年11月20日 13:15:49 hzwy23 阅读数:5313 友情推广 ###使用游标修改数据 ####定义一个游标,游标名称为 mycursor ##### ...
- oracle没有提交更新,oracle 中更新update不成功的原因
oracle 中执行insert into 与delete 都正常,但是执行update 却没有反应. 原因: 是因为记录锁.这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在o ...
- oracle update更新语句
注意:oracle中update多列用逗号分隔. 1.update IOP_T_USERINFO t set (t.birthday, t.department)=(select '5202','南京 ...
- oracle中nowait怎么用,oracle中UPDATE nowait 的使用方法介绍
oracle中UPDATE nowait 的使用方法介绍 1.UPDATE nowait 应用以下场景:查询某条数据,并对其开启数据库事务.如果查询的当前数据没有加锁,则正确返回结果,并对当前数据加锁 ...
- oracle回退的办法,【案例】Oracle for update回退导致业务阻塞的解决办法
[案例]Oracle for update回退导致业务阻塞的解决办法 时间:2016-11-02 20:53 来源:Oracle研究中心 作者:HTZ 点击: 次 天萃荷净 Oracle研 ...
- oracle联表更新语句
oracle联表更新语句,此处为什么要写下来呢,因为信誓旦旦地用sql中的语句去更新oracle,发现不通用,但是查询可以.所以特意写下来,以免忘记或提醒需要的你们~~ 第一种: update lqp ...
- oracle千万行update优化,Oracle的update优化
Oracle的update语句优化研究 一. update语句的语法与原理 1. 语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值如:update t_join ...
- linux update更新源
类似于windows的自动更新,linux也有相应的更新方式. 更新命令: $sudo apt-get update #更新 $sudo apt-get upgrade #升级,需要用update ...
- windows update更新时出现错误代码 8024200D解决方法(转)
windows update更新时出现错误代码 8024200D解决方法(转) 参考文章: (1)windows update更新时出现错误代码 8024200D解决方法(转) (2)https:// ...
最新文章
- c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc
- centos图形界面和文本界面登陆切换设置
- 可视化卷及神经网络热力图
- 转载学习笔记:c++atoi
- python添加时间戳_在python中添加时间戳
- linux上修改html,linux进程名修改
- zip4j -- Java处理zip压缩文件
- 全国计算机二级c 笔记,[IT认证]全国计算机等级考试二级C语言笔记.doc
- 手绘流程图,教你WSL2与Docker容器无缝互相迁移
- 2014年西安区域赛的几道水题(A. F. K)
- 怎么用eclipse编写python_python用eclipse开发配置
- BZOJ.2555.SubString(后缀自动机 LCT)
- 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·007【uni-app和vue.js基础快速上手】
- go语言和php哪个建站好,从0开始Go语言,用Golang搭建网站
- 用74LS161和74LS138加必要的门电路实现下面波形图的电路.
- ele组件JS弹框(确定或取消操作)
- UAC 管理员权限 程序 防止弹窗的四种解决办法
- 计算机考研和不考研的区别,考研和不考研有什么区别?问清楚自己考研动机
- 他一个人干掉了5个装甲军
- git clone 项目时总是提示输入密码