【问题标题】:Delete data uploaded on a certain date but there is no date column in the table删除某个日期上传的数据,但表格中没有日期列
【发布时间】:2018-01-14 15:17:07
【问题描述】:

我正在尝试从 Oracle 表中删除数据。我今天已经上传了数据,但没有日期列,所以我无法过滤和删除。我必须找到如何在表格中获取今天上传的数据,然后按此过滤并删除。

我想要这样的东西:

delete from mytable
where  uploaded_date = trunc(sysdate)

我正在使用 Toad。

谢谢

【问题讨论】:

  • 如果没有日期列,您必须求助于更新生成的日志或其他有关负载的元数据。
  • 可能您可以使用select * from mytable as of timestamp ... 语法(闪回查询),具体取决于您的 Oracle 版本和许可。
  • 为什么不添加一个日期列!

标签: sql oracle sysdate


【解决方案1】:

我认为您想及时返回yesterday 获取您的表格数据。如果是这样,您可以使用Oracle DB的Flashback Table操作,提供

  • 您的数据库版本至少为10g
  • 您必须已被授予FLASHBACK ANY TABLE 系统特权,或者您必须拥有该表的FLASHBACK 对象特权。
  • 您必须拥有桌子上的SELECTINSERTDELETEALTER 权限。
  • 保留在撤消表空间中的撤消信息必须及时回溯,以满足指定的目标时间点或SCN 用于FLASHBACK TABLE 操作。 (对于此选项,您可以咨询您的 DBA)。
  • 必须在您为其发出FLASHBACK TABLE 语句的表上已经启用行移动。您可以使用此语句启用行移动:

    SQL> ALTER TABLE mytable ENABLE ROW MOVEMENT;

但如果尚未启用,请不要使用这句话来更改 表,因为您的撤消数据会因发出 DDL 而丢失。在这种情况下 您可以使用 闪回查询
select * from mytable as of timestamp timestamp '2018-01-14';

恢复

你可以通过发出(今天的日期是2018-01-14)回到昨天的数据:

  SQL> FLASHBACK TABLE mytable TO TIMESTAMP 
      TO_TIMESTAMP('2018-01-14 00:00:00','YYYY-MM-DD HH:MI:SS') 
      ENABLE TRIGGERS;

如果您的表没有任何触发器,您可以在末尾省略 ENABLE TRIGGERS 部分(FLASHBACK TABLE 操作的默认设置是禁用表上的触发器)。

重要提示:在应用闪回表操作之前,您应该 备份为CREATE TABLE mytable_ AS SELECT * FROM mytable;

【讨论】:

  • 闪回是个好主意,但不要运行该 alter table 语句,否则您的旧数据将会丢失。相反,使用诸如select * from mytable as of timestamp timestamp '2018-01-14'; 之类的闪回查询来帮助识别新行。但是在您的 UNDO 数据过期之前尽快完成!根据您的系统配置,您可能只能在几分钟内使用 UNDO。
  • @JonHeller 非常感谢你,你说得对,我没注意到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
相关资源
最近更新 更多