2012-07-25 22 views
7

如何從表格中排序值,從插入時間開始遞增。這個問題沒有專門的專欄,如時間戳或自動增量。MySQL,ORDER BY插入順序,沒有排序列

我知道這是不建議做......但我想知道如何做到這一點。

據我的理解,如果在插入值之前沒有添加排序列(例如timestamp或autoincremental),則無法通過插入對它們進行排序。

回答

7

無法保證在查詢中沒有ORDER BY子句的情況下,行將以任何特定順序返回。

對於返回表中所有行的所有列的簡單查詢...例如,

SELECT * FROM mytable ; 

對於這樣的查詢,很可能是,MySQL將執行全表掃描,從表的開始,所以它很可能是行會,他們在物理存儲中發現的順序返回。

這可能大致對應於插入行的順序,如果沒有刪除,沒有更新和重新組織,插入行的空間後來被回收,並且被重新用於存儲新插入的行。

但是,此行爲不能保證。要按照它們插入的順序返回行,您確實需要在該行的列中存儲該信息(即插入行的順序)。

+0

好的答案。是的,這種行爲是不能保證的,我可以說,因爲它們在插入時沒有相應的排序。 – jacktrades 2012-07-25 18:59:10

+0

但是,在插入行時按照降序排列 – 2014-09-02 19:08:07

+1

@Bhavesh Gangani:是的,行可以插入特定的順序。但是,它並不保證SELECT語句將按照插入行的順序或者以任何特定順序返回行,除了在ORDER BY子句中指定的順序。如果我們需要按照插入的順序返回行,那麼我們需要爲每行提供這些信息。這通常存儲在行本身中,但在邊緣情況下,它可以存儲在另一個表中,可以爲每行導出它。 – spencer7593 2014-09-02 20:43:14

0

需要有一個列來爲您的查詢排序。通常這是一個插入時間戳,或者遞增ID /遞增鍵。否則無法保證訂單,因爲沒有記錄。

relevant thread from MySQL forum

+0

100%確定MySQL沒有關於插入時間的記錄或類似這種排序的任何記錄? – jacktrades 2012-07-25 18:48:34

+0

爲什麼不只是添加一個時間戳列?是的,100%肯定。要訂購查詢,您需要通過*訂購*。 – Dima 2012-07-25 18:50:17

+0

從MySQL論壇閱讀:'一般來說,當你沒有指定任何命令時,你不應該依賴數據庫返回的行的順序,我看不出任何確定性。 – jacktrades 2012-07-25 18:50:42

1

您可以ORDER BY東西,你可以得到你的表。如果你在那裏沒有任何東西可以用來找出你需要的訂單,你就不能按它來訂購。

+0

這是100%準確嗎? – jacktrades 2012-07-25 18:47:22

+2

那麼,添加一個我認爲是假的答案會很奇怪,現在不是嗎?你接受的答案基本上也是這樣說的,但不知怎的,似乎意味着你可以做別的事情,你真的做不到。如果你不能訂購,你不能訂購。其餘的是不值得一提的。 – Nanne 2012-07-25 19:17:55

1

根據表中的數據,您可以通過數據的ID進行排序 - 如果數據具有單個增量整數以確保PK的唯一性。除非數據被捕獲並記錄在表格中,否則沒有其他方法可以對插入順序進行排序。

我不知道MySQL中的任何內容都會保留關於您尚未在表級別指定的記錄的額外(元)信息。