精华内容
下载资源
问答
  • 今天主要以oracle数据库为例,介绍关于表中数据删除的解决办法。(不考虑全库备份和利用归档日志)删除表中数据有三种方法:·delete(删除一条记录)·drop或truncate删除表格中数据 1.delete误删除的解决方法...

    今天主要以oracle数据库为例,介绍关于表中数据删除的解决办法。(不考虑全库备份和利用归档日志)
    删除表中数据有三种方法:
    ·delete(删除一条记录)
    ·drop或truncate删除表格中数据

     

    1.delete误删除的解决方法
    原理:

    利用oracle提供的闪回方法,如果在删除数据后还没做大量的操作(只要保证被删除数据的块没被覆写),就可以利用闪回方式直接找回删除的数据
    具体步骤为:

    *确定删除数据的时间(在删除数据之前的时间就行,不过最好是删除数据的时间点)

    *用以下语句找出删除的数据:select * from 表名 as of timestamp to_timestamp('删除时间点','yyyy-mm-dd hh24:mi:ss')

    *把删除的数据重新插入原表:

         insert into 表名 (select * from 表名 as of timestamp to_timestamp('删除时间点','yyyy-mm-dd hh24:mi:ss'));注意要保证主键不重复。

    如果表结构没有发生改变,还可以直接使用闪回整个表的方式来恢复数据。

    具体步骤为:

    表闪回要求用户必须要有flash any table权限

     

     --开启行移动功能 

     ·alter table 表名 enable row movement

     --恢复表数据
     ·flashback table 表名 to timestamp to_timestamp(删除时间点','yyyy-mm-dd hh24:mi:ss')

     --关闭行移动功能 ( 千万别忘记 )

     ·alter table 表名 disable row movement


    2.drop误删除的解决方法

    原理:由于oracle在删除表时,没有直接清空表所占的块,oracle把这些已删除的表的信息放到了一个虚拟容器“回收站”中,而只是对该表的数据块做了可以被覆写的标志,所以在块未被重新使用前还可以恢复。

    具体步骤:

    *查询这个“回收站”或者查询user_table视图来查找已被删除的表:

     · select table_name,dropped from user_tables

     · select object_name,original_name,type,droptime from user_recyclebin

    在以上信息中,表名都是被重命名过的,字段table_name或者object_name就是删除后在回收站中的存放表名

    *如果还能记住表名,则可以用下面语句直接恢复:

      flashback table 原表名 to before drop

     如果记不住了,也可以直接使用回收站的表名进行恢复,然后再重命名,参照以下语句:

      flashback table "回收站中的表名(如:Bin$DSbdfd4rdfdfdfegdfsf==$0)" to before drop rename to 新表名

    oracle的闪回功能除了以上基本功能外,还可以闪回整个数据库:

    使用数据库闪回功能,可以使数据库回到过去某一状态, 语法如下:

    SQL>alter database flashback on
    SQL>flashback database to scn SCNNO;
    SQL>flashback database to timestamp to_timestamp('2007-2-12 12:00:00','yyyy-mm-dd hh24:mi:ss');


    总结:
    oracle提供以上机制保证了安全操作,但同时也代来了另外一个问题,就是空间占用,由于以上机制的运行,使用drop一个表或者delete数据后,空间不会自

    动回收,对于一些确定不使用的表,删除时要同时回收空间,可以有以下2种方式:

      1、采用truncate方式进行截断。(但不能进行数据回恢复了)

      2、在drop时加上purge选项:drop table 表名 purge

         该选项还有以下用途:

      也可以通过删除recyclebin区域来永久性删除表 ,原始删除表drop table emp cascade constraints
       purge table emp;
       删除当前用户的回收站:
        purge recyclebin;
       删除全体用户在回收站的数据:
       purge dba_recyclebin

    转载于:https://www.cnblogs.com/cyl048/p/6509277.html

    展开全文
  • 删除重复记录最小的rowid DELETE FROM TEST_USER A WHERE (A.USERNAME, A.PASSWORD) IN (SELECT USERNAME, PASSWORD FROM TEST_USER GROUP BY USERNAME, PASSWORD HAVING COUNT(*) >

    重复记录:有两个意义上的重复记录。

    一是完全重复的记录,也即所有字段均重复的记录;

       select distinct * from tableName  查询无重复记录的结果集

       发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。  

    二是部分关键字段重复的记录,比如Name字段,password重复,而其他字段不一定重复或都重复可以忽略。
         1、查找全部重复记录

         Select * From 表 Where 重复字段 In (Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1)

         2、过滤重复记录(只显示一条)

           Select * From HZT Where ID In (Select Max(ID) From HZT Group By Title)注:此处显示ID最大一条记录


         删除重复记录--大的rowid(即保留最小的rowid的那条数据记录)

    DELETE FROM TEST_USER A
     WHERE (A.USERNAME, A.PASSWORD) IN
           (SELECT USERNAME, PASSWORD
              FROM TEST_USER
             GROUP BY USERNAME, PASSWORD
            HAVING COUNT(*) > 1)
       AND ROWID NOT IN (SELECT MIN(ROWID)
                           FROM TEST_USER
                          GROUP BY USERNAME, PASSWORD
                         HAVING COUNT(*) > 1)

    或者:

    2。保留一条(这个应该是大多数人所需要的 ^_^)

    Delete HZT Where ID Not In (Select Max(ID) From HZT Group By Title)





    展开全文
  • ORACLE恢复删除记录

    2013-04-16 16:37:12
    可根据文档提示做相关操作,可以帮助您恢复点不小心误删除数据
  • 删除重复记录,利用ROWID 和MIN(或MAX)函数, ROWID在整个数据库中是唯一的,由Oracle自己产生和维护,并唯一标识一行(无论该表中是否有主键和唯一性约束),ROWID确定了每条记录在哪个数据文件、哪个块上。...

    删除重复记录,利用ROWID 和MIN(或MAX)函数, ROWID在整个数据库中是唯一的,由Oracle自己产生和维护,并唯一标识一行(无论该表中是否有主键和唯一性约束),ROWID确定了每条记录在哪个数据文件、哪个块上。

    利用not in:

    delete from manager 

    where ROWID NOT IN( select  MIN(ROWID) from manager group by mgrno);

    删除之前的数据:

    SQL> select * from manager;

         MGRNO MNAME                          JOB
    ---------- ------------------------------ --------------------------
    SALARY
    --------------------------------------------------------------------
            11 Jane                           j1
    1000

            11 Jane                           j2
    1000

            12 Dane                           j1
    1200

            11 Jane                           j1
    1000

            13 Kate                           j0
    1300

     

    删除后:

    SQL> select * from manager;

         MGRNO MNAME                          JOB
    ---------- ------------------------------ ------------------------------
    SALARY
    ---------------------------------------------------------------------------
            11 Jane                           j1
    1000

            12 Dane                           j1
    1200

            13 Kate                           j0
    1300


    已选择3行。

    利用不等于

    delete from  manager  a where ROWID != (select  MAX(ROWID)

    from manager b where a.mgrno =b.mgrno)

    利用临时表:

    创建一个临时表 tem_manager , 该表中存放的数据和表manager 的相同,只是该表中不存放重复记录。

    create table tem_manager

    as

    (select  distinct mgrno,mname,job,salary from manager);

    然后删除表manager中的数据:

    truncate table manager;

    把临时表中的数据插入到原来的表manager中:

    insert into  manager

    select * from tem_manager;

    转载于:https://www.cnblogs.com/happinessqi/p/3348935.html

    展开全文
  • Oracle查找删除记录后表中某一时间点的数据   ------------------------------------------------------------------------------------ 删除数据前表中记录 1> sele

    http://blog.chinaunix.net/uid-16861721-id-2857492.html


    Oracle查找删除记录后表中某一时间点的数据
     
    ------------------------------------------------------------------------------------
    删除数据前表中记录
    1> select t.*, t.rowid from vt_temp_test;
    1 1 2 3.00 4.00
    2 5 6 7.00 8.00
    3 9 10 11.00 12.00
    4 13 14 15.00 16.00
     
    记录原数据完整时间点
    2> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
    1 2009-01-08 09:23:53
     
    删除表中记录
    3> delete from vt_temp_test;
     
    找回原数据完整时间点数据
    4> select * from vt_temp_test as of timestamp to_timestamp('2009-01-08 09:23:53', 'yyyy-mm-dd hh24:mi:ss'); 
    1 1 2 3.00 4.00
    2 5 6 7.00 8.00
    3 9 10 11.00 12.00
    4 13 14 15.00 16.00
     
    插入丢失数据到原表
    5> insert into vt_temp_test select * from vt_temp_test as of timestamp to_timestamp('2009-01-08 09:23:53', 'yyyy-mm-dd hh24:mi:ss');
     
    验证数据恢复情况
    6> select * from vt_temp_test
    1 1 2 3.00 4.00
    2 5 6 7.00 8.00
    3 9 10 11.00 12.00
    4 13 14 15.00 16.00
     
    ---- 此时表明数据已完全恢复到原数据完整时间点的数据 ----

    #### 注:当执行 truncate table vt_temp_test 时,就无法恢复数据,查找当时数据会报错:ORA-01466 unable to read table - table definition has changed。drop table vt_temp_test则更不可恢复 ####

    展开全文
  • 声明:文章来自互联网不是原创Oracle 中如何删除重复数据我们可能会出现这种情况,某个表原来设计不周全,导致表里面的数据数据重复,那么,如何对重复的数据进行删除呢?重复的数据可能有这样两种情况,第一种时表...
  • oracle删除重复记录

    2013-12-18 16:03:49
    Oracle数据库中经常用到删除重复数据的场景,此文帮助你来删除oracle中的重复数据 只留其中一条数据
  • oracle查询重复数据删除重复记录示例分享,大家参考使用吧
  • Oracle删除重复记录只保留一条数据的几种方法
  • ORACLE 恢复删除记录

    2013-03-18 18:59:57
    删除表后,可以采用如下操作:在 user_recyclebin中找到最近操作过的表...如果是删了或修改里面的数据,可以先建立一个快表将删除修改之前状态的数据找回到这个表中: CREATE TABLE QUICK_TABLE AS SELECT * FROM TA
  • Oracle查询重复数据删除重复记录方法,Oracle查询重复数据删除重复记录方法
  • oracle 快速删除大批量数据方法(全部删除,条件删除删除大量重复记录) ** 全部删除 如果是删除某个表的所有数据,并且不需要回滚,使用 TRUNCATE 就ok了。 SQL> truncate table table_name; 条件删除 如果...
  • 1、从数据表t1中把那些id值在数据表t2里有匹配的记录删除掉DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 或DELETE FROM t1 USING t1,t2 WHERE t1.id=t2.id2、从数据表t1里在数据表t2里没有匹配的记录查找出来并删除掉...
  • 正在看的ORACLE教程是:oracle快速删除重复的记录。做项目的时候,一位同事导数据的时候,不小心把一个表中的数据全都搞重了,也就是说,这个表里所有的记录都有一条重复的。这个表的数据是千万级的,而且是生产系统...
  • DELETE FROM AFA_AUTH_PARTY A WHERE (A .ROLE_CODE, A .PARTY_CODE,A.FISCAL) IN ( SELECT ROLE_CODE, PARTY_CODE, FISCAL FROM AFA_AUTH_PARTY GROUP BY ROLE_CODE, ... FIS...
  • oracle数据快速删除

    千次阅读 2015-06-29 10:10:27
    上文说了创建数据还原点的事,数据恢复的前提是我们在删除的时候使用了delete命令来删除,delete在删除的过程中会写日志(所以我们的数据才能够恢复),当然,写日志会导致删除速度变慢。如果我们使用truncate命令来...
  • 对于数据库表中有海量的数据记录的...以下是一个方法来批量删除数据记录: [code="java"]CREATE OR REPLACE PROCEDURE delbigtab ( p_tablename IN VARCHAR2, p_condition IN VARCHAR2, p_count ...
  • Oracle数据库删除重复的记录 使用ROWID对重复记录进行删除 -- 1.我们的表名:TTRD_CFETS -- 2.如果两条记录是完全相同的,使用区别去其他数据的字段即可:UPDATETIME -- 3.如果我们希望根据指定字段对数据进行分组...
  • Oracle查询重复数据删除,只保留一条记录.docx
  • 适用于有大量重复记录的情况(Exception into 子句法):  采用alter table 命令中的 Exception into 子句也可以确定出库表中重复的记录。这种方法稍微麻烦一些,为了使用“excepeion into ”子句,必须首先创建 ...
  • 几个删除重复记录的SQL语句  1.用rowid方法  2.用group by方法  3.用distinct方法  1。用rowid方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,583
精华内容 1,033
关键字:

oracle数据删除记录