Oracle中只更新两张表对应数据的方法

数据库 Oracle 数据库运维
本文将讲解Oracle中只更新两张表对应数据的方法,主要是解决遇到需要从另外一个表来更新本表的值的问题的时候。

先建立一个结构一模一样的表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中的很多值变成空。

这是因为在oracle的update语句中如果不写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所独有的。先把对应的数据全部抽取出来,然后更新表一样更新数据,这里需要注意的是,必须保证表的数据唯一型。

【编辑推荐】

  1. 善用Oracle表空间设计提升数据库性能
  2. 使用Java编写Oracle存储过程
  3. 详解Oracle数据库中DUAL表的使用
责任编辑:彭凡 来源: qzone
相关推荐

2010-09-09 15:23:16

SQL更新数据

2019-07-16 08:57:15

kafka应用Broker

2016-06-02 14:10:35

iPhoneAndroid

2011-02-25 13:10:23

两个数据库服务器两个数据库两张表连接查询

2011-07-18 17:16:14

CSVPLSQLDevelope

2013-05-10 09:31:06

程序员

2010-08-04 11:38:24

Oracle数据库

2020-07-06 14:42:36

业务架构IT架构直播

2009-11-20 10:55:13

Oracle数据比较

2017-05-04 11:09:21

互联网

2010-09-09 15:13:33

SQL更新数据

2011-05-17 11:23:02

Oracle数据库

2010-09-02 10:36:51

SQL删除

2009-05-21 09:24:42

表空间查询Oracle

2010-10-28 16:17:22

2017-05-31 15:27:54

2021-03-16 09:02:33

PythonMapinfo数据切块处理

2010-10-29 16:48:30

oracle查询所有表

2010-04-01 17:14:04

Oracle索引

2014-01-23 16:27:44

域名解析异常互联网瘫痪DNS
点赞
收藏

51CTO技术栈公众号