假设我有表我的表有值(它们是 varchar):
值
a
o
g
t
我插入了一个名为 V 的新值
值
V
a
o
g
t
有没有一种方法或查询可以指定在列中插入的最后一个值是什么?
所需的查询: select * from dual where rown_num = count(*) - 只是一个例子
,结果将是 V
假设我有表我的表有值(它们是 varchar):
值
a
o
g
t
我插入了一个名为 V 的新值
值
V
a
o
g
t
有没有一种方法或查询可以指定在列中插入的最后一个值是什么?
所需的查询: select * from dual where rown_num = count(*) - 只是一个例子
,结果将是 V
表中的行没有固有的顺序。rownum
是一个伪列,它是 select 的一部分,因此在这里没有用。没有办法知道新行将物理放置在存储中的哪个位置,因此您不能依赖rowid
.
可靠地做到这一点的唯一方法是拥有一个时间戳列(可能由触发器设置,因此您不必担心它)。这将允许您按时间戳对行进行排序,并找到具有最高(最近)时间戳的行。
你仍然受到时间戳精度的限制,因为我发现创建了一个SQL Fiddle 演示;没有强制插入之间的小间隙时间戳都是相同的,但它似乎只支持`timestamp(3)。这在现实世界中可能不会是一个重大问题,除非您正在执行批量插入,但插入的最后一行仍然是一个任意概念。
正如评论中非常正确地指出的那样,如果不需要知道实际时间,则由序列填充的数字字段将更加可靠和高效;另一个SQL Fiddle 演示在这里,这是要点:
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;