【问题标题】:Oracle finding last row insertedOracle查找插入的最后一行
【发布时间】:2013-06-26 20:26:39
【问题描述】:

假设我有表 我的表 有值(它们是 varchar):

价值观
一个
o
g
t

我已经插入了一个名为 V 的新值


V
一个
o
g
t

有没有一种方法或查询可以指定在列中插入的最后一个值是什么?
所需查询:select * from dual where rown_num = count(*) -- 只是一个示例
结果将是 V

【问题讨论】:

    标签: oracle


    【解决方案1】:

    表中的行没有固有的顺序。 rownum 是一个伪列,它是 select 的一部分,因此在这里没有用。无法确定新行将实际放置在存储中的哪个位置,因此您不能依赖 rowid,例如。

    可靠地做到这一点的唯一方法是拥有一个时间戳列(可能由触发器设置,因此您不必担心它)。这将允许您按时间戳对行进行排序,并找到具有最高(最近)时间戳的行。

    你仍然受到时间戳精度的限制,因为我发现创建了一个SQL Fiddle demo;没有强制插入之间的小间隙时间戳都是相同的,但它似乎只支持`timestamp(3)。这在现实世界中可能不会是一个重大问题,除非您进行批量插入,但插入的最后一行仍然是一个随意的概念。


    正如在 cmets 中非常正确地指出的那样,如果不需要知道实际时间,则由序列填充的数字字段会更加可靠和高效;另一个SQL Fiddle demo here,这是要点:

    create table t42(data varchar2(10), id number);
    
    create sequence seq_t42;
    
    create trigger bi_t42
    before insert on t42
    for each row
    begin
      :new.id := seq_t42.nextval;
    end;
    /
    
    insert into t42(data) values ('a');
    insert into t42(data) values ('o');
    insert into t42(data) values ('g');
    insert into t42(data) values ('t');
    
    insert into t42(data) values ('V');
    
    select data from (
      select data, row_number() over (order by id desc) as rn
      from t42
    )
    where rn = 1;
    

    【讨论】:

    • "你还是受限于时间戳的精度";所以你不能使用一个唯一的ID来代替每个条目递增吗?具有最大 uuid 的行必须是最新的。
    • Alex,如果两个值几乎同时插入会怎样?那么有一个数字字段并使用触发器增加数字会更好吗?编号字段可以称为record_version,查询最大值为record_version
    • 是的,同意你们两个,由序列中的触发器填充的 ID 字段确实会更好。如果您也想知道它何时插入,这很有用,但这不是问题 *8-)
    • 好吧,@AlexPoole 非常感谢您的信息和帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多