2014-03-25 89 views
1

我们如何知道表格中的第一个插入记录,让我们考虑我们已经将100万条记录加载到表格中,并且我们在这里没有任何时间戳记列。 如何找到它?首先在oracle表中插入记录?

+0

不幸的是,没有办法找到这个。 – abhi

+0

_Why_你需要这些信息吗?你想要做什么? –

+1

您可以在单个原子事务中插入多条记录。对于插入“第一”记录意味着什么? –

回答

2

如果没有表示插入顺序的列,如时间戳,串行字段(例如:主键),则没有方法可以找到第一个插入的行。 SQL标准清楚地表明数据集没有排序(没有“自然”顺序)。所有hack像rownum,row id等都不保证在重新索引数据库,重新加载数据库和类似的操作之后工作。

+2

尽管取决于应用程序设计,具有“第一个”ID的行可能不是第一行_committed_,反正...... –

+0

您是对的 - 确定“第一行”的含义本身就是一个问题。 – piotrpo

0

不是100%准确(如piotrpo指出的),但如果你都OK与ORA_ROWSCNdocs)提供的值的精确度,你可以找出哪些行已先插入(当然,如果:这不是什么t稍后更新)。是正确的,甚至排不出,但如果行所在的块 - 您可以使用DBMS_ROWID功能,深入到行级(同样,不是100%准确):

SELECT DBMS_ROWID.ROWID_ROW_NUMBER(ROWID), 
SCN_TO_TIMESTAMP(ORA_ROWSCN) 
FROM table1 ORDER BY 2 DESC, 1 ASC 
+0

我刚刚进行了一次测试,这在Oracle 10G上对我无效。正如你所说的那样,这并不准确。我在表格中有一个序列列,所以我知道哪一行是先插入的。 – abhi

+0

这是我在[sqlfiddle](http://sqlfiddle.com/#!4/d588b/1/0)上的测试。 – abhi

+0

@abhi由于缓存,序列并不能保证确切的顺序。同时考虑回滚,并发等。 – ThinkJet

0

如果您已经确定与IDS列你无论如何不知道哪一行是第一个,因为你不知道是否有人手动添加id低于然后休息的行,一种解决方案是添加到表格字段与时间戳/日期格式插入或修改每行插入时间。但是...

SELECT SCN_TO_TIMESTAMP(ora_rowscn),ora_rowscn FROM your_table

当你连续被修改,你可以找到/加...也许有一些解决方案,但不是ROWID。这样,你只能找到第一个/最后更新的行...

0

刚刚从MY_TABLE使用ROWID像

选择*,其中的rowid在 ( 从MY_TABLE 选择分钟(ROWID))

它应该工作

+0

我不认为rowid适合我的要求。 rowid基于插入的记录生成?如果将来发生变化呢? –