博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle update from
阅读量:7280 次
发布时间:2019-06-30

本文共 1388 字,大约阅读时间需要 4 分钟。

很多熟悉SQL server的朋友在接触到oracle的时候经常犯的一个错误就是总以为oracle中也会有update from这种结构。请你死了这条心吧,在oracle中的update语句中不存在from语句。

前面我们简单介绍过Oracleupdate语句。这里我们重点介绍如果基于别的表来更新当前表的update语法。

我们知道在oracle中的例子数据库中有名为scott的schema,里面有一个表是emp,我们就拿这里表来举例

先建立一个结构一模一样的表emp1,并为其插入部分数据

create table emp1

as
select * from emp where deptno = 20;

update掉emp1中的部分数据

update emp1
set sal = sal + 100,
comm = nvl(comm,0) + 50

然后我们试着使用emp1中数据来更新emp中sal 和 comm这两列数据。

我们可以这么写

Update emp
Set(sal,comm) = (select sal,comm. From emp1 where emp.empno = emp1.empno)
Where exists (select 1 from emp1 where emp1.empno = emp.empno)

请你尤其注意这里的where子句,你可以尝试不写where子句来执行以下这句话,你将会使得emp中的很多值变成空。

这是因为在oracleupdate语句中如果不写where子句,oracle将会默认的把所有的值全部更新,即使你这里使用了子查询并且某在值并不能在子查询里找到,你就会想当然的以为,oracle或许将会跳过这些值吧,你错了,oracle将会把该行的值更新为空。

我们还还可以这么写:

update (select a.sal asal,b.sal bsal,a.comm acomm,b.comm bcomm from emp a,emp1 b where a.empno = b.empno)

set asal = bsal,
acomm = bcomm;

这里的表是一个类视图。

当然你执行时可能会遇到如下错误:

ERROR 位于第 2 行:

ORA-01779: 无法修改与非键值保存表对应的列
这是因为新建的表emp1还没有主键的缘故

下面增加一个主键

alter table emp1
add constraint pk_emp1 primary key (empno);

执行之后

在执行前面的语句就能成功。

这里我们总结一下:

oracle中不存在update from结构,所以遇到需要从另外一个表来更新本表的值的问题的时候,有两种解决的办法:

一种是使用子查询,使用子查询时一定要注意where条件(一般后面接exists子句),除非两个表是一一对应的,否则where条件必不可少,遗漏掉where条件时可能会导致插入大量空值。

另外一种是类视图的更新方法,这也是oracle所独有的。先把对应的数据全部抽取出来,然后更新表一样更新数据,这里需要注意的是,必须保证表的数据唯一型。

转载于:https://www.cnblogs.com/JSD1207ZX/p/9386291.html

你可能感兴趣的文章
C++多态的概念
查看>>
关于中文乱码问题的一些解决方案和经验
查看>>
Cisco 交换机命令全集
查看>>
Why Namespace? - 每天5分钟玩转 OpenStack(102)
查看>>
review what i studied `date` - 2017-4-19
查看>>
linux系统中如何查看日志 (常用命令)
查看>>
Java IO与NIO 学习
查看>>
SSH登录的时候显示一些实用信息
查看>>
CentOS 7 安装 MySQL
查看>>
Cisco 无线AP 初始化配置WPA加密日记
查看>>
java最最基础的题目(满分100分,笔试,不可上机):
查看>>
5月第1周中国五大顶级域名净增6,103个 美国净减7万个
查看>>
12月第3周全球域名商新增注册量20强:易名夺冠
查看>>
js伪3D图片翻页特效,带缩略图可无限屏
查看>>
从ORACLE RAC角度看跨数据中心的存储双活配置注意事项
查看>>
【产品功能】配置网卡从此与关机无缘,弹性网卡支持热插拔功能
查看>>
深入解读HBase2.0新功能之高可用读Region Replica
查看>>
发布国内首个无服务器容器服务,运维效率从未如此高效
查看>>
国外服务器不能打开国内网站是什么问题?
查看>>
android 蓝牙监测
查看>>