Oracle修改数据

僤鯓⒐⒋嵵緔 提交于 2020-01-15 12:31:05

一:简单更新

update … set … where…

二:子查询更新

update … set … (select…from…where…)

三:使用MERGE更新

匹配的则update
不匹配的insert

CREATE TABLE t1(ID NUMBER,NAME VARCHAR(10) ,status VARCHAR(10));

CREATE TABLE t2(ID NUMBER,NAME VARCHAR(10) ,status VARCHAR(10));

INSERT ALL

INTO t1(ID,NAME,status) VALUES(1,'a','0')
INTO t1(ID,NAME,status) VALUES(2,'b','0')
INTO t1(ID,NAME,status) VALUES(3,'c','0')
SELECT * FROM dual;

INSERT ALL
 INTO t2(ID,NAME,status) VALUES(2,'d','1')
 INTO t2(ID,NAME,status) VALUES(3,'e','1')
 INTO t2(ID,NAME,status) VALUES(4,'f','1')
 SELECT * FROM dual;


 MERGE INTO t1 USING t2
 ON (t1.id=t2.id)
 WHEN MATCHED THEN UPDATE SET t1.status=t2.status     --匹配就更新t1的数据
   WHEN NOT MATCHED THEN INSERT VALUES(t2.id,t2.name,t2.status);  --不匹配就插入t1表

SELECT * FROM t1
结果 :
1    1    a    0
2    2    b    1
3    3    c    1
4    4    f    1

注意:
1.update跟新的列不能是使用在on连接条件后面的列
2.这里的t1表必须是oracle实际存在的表,不能是内存表

四:删除数据

1.删除指定行:
delete from 表名 where 条件;

2.删除所有行
delete from 表名;

五:删除重复行

1.先创建临时表:获取所有id出现重复的列
临时表:
create table tmp as
select id,count(1) from t group by id having count(1) >1 ;

2.通过oracle的隐藏列ROWID,保留max(ROWID),其余删除即可
delete from t t1 where ROWID != (
select max(t2.ROWID) from t t2 where t2.id in (select id from tmp) and t1.id = t2.id
);

六:使用TRUNCATE截断表

1.在数据处理上truncate table tbl_name = delete from tbl_name
2.delete是DML操作,而truncate是DDL操作,使用delete会产出大量的rollback,占用很多的rollback sergments , 但是truncate不会
3.在内存中,使用delete删除表,被删除的表占用的空间还在,另外数据还可以恢复,除非重启系统(OS或者RDBMS)
4.在内存中,使用truncate删除表,表空间会立即被释放,数据不能够恢复
5.truncate调整高水位线(high water mark , HWM),而delete不调整,使用truncate后,表的HWM退回到initial 和 next 的位置(默认),delete则不可以

注意:
1.delete语句可以回滚,但是truncate语句不可以回滚
2.truncate只能对应table
3.delete可以对应table , view , synonym
4.truncate table 的对象必须是本地模式 , 且必须有drop any table权限
5.delete的对象必须是本地模式 , 且必须有delete any table
6.在外层中,truncate或者delete操作后都释放空间
7.truncate和delete只删除数据,drop删除数据+表结构

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!