2014-03-25 122 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基於插入的記錄生成?如果將來發生變化呢? –