*操作数据库涉及到“删除”数据时,需要提高警惕。
注意1.防止传入错误条件。 2. 防止传入条件为空。
1、truncate和不带where子句的delete、以及drop都会删除表内的数据。
2、drop、truncate都是DDL语句(数据定义语言),执行后会自动提交。不可闪回
3、truncate 和 delete 只删除数据不删除表的结构(定义)
4、drop 语句将"删除表的结构和数据". 被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid 状态
delete和truncate的区别?
(1)delete逐条删除;truncate先摧毁表,再重建
(2)最重要的区别是 delete是DML(DML语句,可以回滚,没有提交事务) truncate是DDL(不可以回滚)
(3)delete不会释放空间; truncate会
(4)delete会产生碎片 t;runcate不会
(5)delete 可以闪回(即便你删了,可以通过闪回来恢复); truncate 不可以(不走Oracle的回收站)
注意:delect删除不加任何条件,就删除了整张表中的数据
碎片:指的是 delete 删除某些数据后,造成每一条和每一条数据之间不连贯,那么就会造成查询时效率比较低。
解决方法:所以我们可以用一条命令来整理某张表中的碎片
- alter table emp move;
思考:闪回的原因?
解答:delete删除的数据,会在Oracle数据库的回收站暂存,所以可以闪回。
--闪回到15分钟前
select * from orders as of timestamp (systimestamp - interval ''15'' minute) where ......
这里可以使用DAY、SECOND、MONTH替换minute,例如:
SELECT * FROM orders AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL ''2'' DAY)
--闪回到某个时间点
select * from orders as of timestamp to_timestamp (''01-Sep-04 16:18:57.845993'', ''DD-Mon-RR HH24:MI:SS.FF'') where ...
或select * from XZLtemp as of timestamp to_timestamp('2018-06-25 11:12:20','yyyy-mm-dd hh24:mi:ss')
--闪回到两天前
select * from orders as of timestamp (sysdate - 2) where.........
/*2.FLASHBACK DROP*/
1.flashback table orders to before drop;
2.如果源表已经重建,可以使用rename to子句:
flashback table order to before drop rename to order_old_version;
/*3.FLASHBACK TABLE*/
1.首先要启用行迁移:
alter table order enable row movement;
2.闪回表到15分钟前:
flashback table order to timestamp systimestamp - interval ''15'' minute;
闪回到某个时间点:
FLASHBACK TABLE order TO TIMESTAMP TO_TIMESTAMP('2007-09-12 01:15:25 PM','YYYY-MM-DD HH:MI:SS AM')