2016-08-29 190 views
1

我有一個3列的表:id(自動遞增PK),product_id,project_id即使自動遞增主鍵,插入也是無序的

product_idproject_id是外鍵。這兩列還有一個獨特的關鍵。

我發現當我做一個簡單的「SELECT * FROM myTable」時,結果主要不是按id列排序的。他們似乎首先被訂購id,但其他2列。所以,我將(5,10)插入表格然後(5,6),然後選擇它們,我得到:

id | product_id | project_id

2 | 5 | 6

1 | 5 | 10

這是怎麼發生的?

+0

您不能指望查詢的結果以相同的插入順序返回。如果你想要結果排序,你應該修改查詢來反映它(按順序)。 – alfasin

回答

1

如果您沒有明確地要求使用ORDER BY的訂單,MySQL會按照從索引中讀取結果的順序顯示結果。

我推測MySQL正在使用您的UNIQUE索引來讀取這些行,因此它們按照product_id的順序先讀取,然後按照project_id的順序讀取。

以此類推,如果您從電話簿中讀取姓名,您可以按姓氏,然後按名字順序閱讀。無論首先分配哪個電話號碼,這是它們存儲的順序。

id列是主鍵,它隱式地附加到每個非主索引。

1

通常情況下,數據庫沒有「默認」順序,所以如果您未指定隱式順序,則無法對結果的最終順序進行任何假設。如果您需要以任何特定順序檢索記錄,則應在查詢結尾附加「ORDER BY」。 請注意,完全相同的查詢,如果沒有按順序排列的子句,可能會以非常不同的順序生成結果。

0

當缺少ORDER BY時,不要依賴訂單。

缺省情況下,ORDER BY關鍵字按升序排序記錄。要按降序對記錄進行排序,可以使用DESC關鍵字。

因此,甚至不能保證看起來相同的兩個查詢將以相同的順序返回結果:如果不指定它,則不能依賴它。

相關問題