如何删除刚刚插入表的那几行数据

悬崖跳舞被人砍 2014-11-27 10:02:26
好比,我昨天向表里插入了100行,今天过来才知道插错了。那么我想删除这100行,没有第二个表可以做连表查询,那么该怎么删除昨天插入的这100行数据呢?我曾经用rownum来删,假设该表现有1500行,我曾经的代码如下:
delete tb1
where rowid in (select rowid from (select rownum as rm,rowid from tb1) where rm > 1400)

但是现在发现,rownum的大小与插入数据的先后可能并不是一一对应的关系。不知道大家能理解不,上一张图
我是按照时间先后插入数据的 ,但是在查询时明显看到11.26号的数据出现在11.25号的数据上面,也就是说rownum并不能真实反映数据插入的先后顺序。那我的问题就来了,该怎么删除最后插入表的100行数据呢?
...全文
468 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
空心兜兜 2014-11-28
  • 打赏
  • 举报
回复
……不用日志应该不行
sych888 2014-11-28
  • 打赏
  • 举报
回复
日志挖掘...........................
sych888 2014-11-28
  • 打赏
  • 举报
回复
楼主用发的ROWNUM很危险,谨慎处理 可以考虑从其他相关点进行处理:如操作时间
  • 打赏
  • 举报
回复
引用 6 楼 bw555 的回复:
先用1#的方法找到这些记录,确认是否是这些记录,然后利用下面语句删除
delete from tb1
where rowid in (select rowid from tb1
minus
select rowid from  tb1 as of  timestamp to_timestamp('2007-05-12 13:22:33', 'YYYY-MM-DD HH24:MI:SS'))
嗯,好的~
bw555 2014-11-27
  • 打赏
  • 举报
回复
先用1#的方法找到这些记录,确认是否是这些记录,然后利用下面语句删除
delete from tb1
where rowid in (select rowid from tb1
minus
select rowid from  tb1 as of  timestamp to_timestamp('2007-05-12 13:22:33', 'YYYY-MM-DD HH24:MI:SS'))
  • 打赏
  • 举报
回复
忘了讲了,真正要操作的表中没有operdate这列,也没有自增长的列,所以从这两方面入手是不可以的~
不写代码的钦 2014-11-27
  • 打赏
  • 举报
回复
有没有插入时间判断,没有很难准确删除。 特别是有删除数据情况。
小灰狼W 2014-11-27
  • 打赏
  • 举报
回复
那么问题来了…… 如果数据是按operdate顺序插入的 可以delete from xxx t1 where (select count(1) from xxx t2 where t2.operdate>t1.operdate)<100 或者如果undo没被覆盖 delete from xxx t1 where t1.rowid not in (select t2.rowid from xxx as of timestamp to_date('2014-11-25 12:00','YYYY-MM-DD HH24:MI') t2) 把时间改成合适的值,会将后来插入的数据删掉 用flashback table xxx to timestamp to_date(xxx,xxx);也行,但是要小心数据丢失
卖水果的net 2014-11-27
  • 打赏
  • 举报
回复


-- 如果 operdate 是你的插入日期, 可以用下面的方法删除 。
-- 之前最好 select 一下,使用同样的条件 。
delete tb1 
where operdate between to_date('2014-11-26 00:00:00,''yyyy-mm-dd hh24:mi:ss) 
 and to_date('2014-11-26 23:59:59,''yyyy-mm-dd hh24:mi:ss) 

bw555 2014-11-27
  • 打赏
  • 举报
回复
试试闪回查询,用现在表中的数据minus闪回查询的数据,差值就是你想查的数据
select * from tb1
minus
select * from  tb1 as of  timestamp to_timestamp('2007-05-12 13:22:33', 'YYYY-MM-DD HH24:MI:SS')
--时间自行调整
以下是涉及到插入格的查询的5种改进方法:   1)使用LOAD DATA INFILE从文本下载数据这将比使用插入语句快20倍。   2)使用带有多个VALUES列的INSERT语句一次插入几行这将比使用一个单行插入语句快几倍。调整bulk_insert_buffer_size变量也能提高(向包含行的格中)插入的速度。   3)可以对myisam并行插入Concurrent_insert系统变量可以被设置用于修改concurrent-insert处理。该变量默认设置为1。如果concurrent_insert被设置为0,并行插入就被禁用。如果该变量被设置为2,在的末端可以并行插入,即便该的某些行已经被删除。   4)使用插入延迟   如果你的客户不能或无需等待插入完成的时候,这招很有用。当你使用MySQL存储,并定期运行需要很长时间才能完成的SELECT和UPDATE语句的时候,你会发现这种情况很常见。当客户使用插入延迟,服务器立刻返回,如果没有被其他线程调用,则行会列队等待被插入。使用插入延迟的另一个好处就是从多个客户插入的情况会被绑定并记录在同一个block中。这将比处理多个独立的插入要快得多。   5)插入之前将锁定(只针对非事务处理型的)   这将提高数据库性能,因为索引缓冲区只是在所有的插入语句完成后才对磁盘进行一次刷新。通常情况下,有多少个插入语句就会有多少次索引缓冲区刷新。如果你可以用一个插入语句实现所有行的插入,则无需使用显式锁定语句。   要想更快地对事务型插入,你应该使用START TRANSACTION和COMMIT语句,而不是LOCK TABLES语句。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧