2016-09-07 2 views
2

geben Ich betreibe diese MySQL-Abfrage wählen:MySQL Auswahlabfrage falsche Sequenzen von Zeilen aus Primärschlüssel

select * from ABC where column_value=1; 

Ich erwarte Ausgabe wie folgt zu erhalten:

ID Name 
1  AAA 
2  BBB 
3  CCC 

Aber stattdessen erhalte ich diese :

ID Name 
2  BBB 
1  AAA 
3  CCC 

Kann jemand mir eine Idee geben, warum MySQL sich so benimmt?

+0

Welche Spalte wird mit 'column_value' bezeichnet? – 1000111

+0

Verwenden Sie "Order by", um in Ordnung zu kommen – jophab

+0

Haben Sie Ihren Primärschlüssel als AUTO_INCREMENT festgelegt? Wenn nicht, und wenn Sie sie manuell eingegeben haben, könnte dies zu einer Ausgabe führen. –

Antwort

4

Datenbanken verwenden den schnellsten Weg, um Daten aus Tabellen zu lesen. Dies bedeutet, dass Daten in beliebiger Reihenfolge zurückgegeben werden können, wenn sie schneller gefunden werden, es sei denn, Sie verwenden eine ORDER BY-Klausel.

+0

Danke. Aber meine Annahme, dass MySQL Daten nach Primärschlüssel holt. Vorher habe ich Daten richtig bekommen. – Nik0990

+1

Das 'where column_value = 1' kann dazu führen, dass es einen anderen Index als den Primärschlüssel verwendet und das Ergebnis möglicherweise anders ist. Sie sollten sich niemals auf die Reihenfolge verlassen, es sei denn, ORDER BY wird verwendet. –

0

Standardmäßig ID ie. Standard-Primärschlüssel wird für "order by" verwendet, ist es möglich, dass Sie einige Zeilen gelöscht haben?

+0

ID ist Primärschlüssel.Das Löschen von Datensätzen wirkt sich daher auf die Einfüge-/Auswahlreihenfolge aus. – Nik0990

+0

Ja, wenn Sie keine Reihenfolge angeben, wird die ID angezeigt, und Aktualisierungen/Löschungen können sich auf die erwartete Ausgabe auswirken. – iSensical

0
select * from ABC where column_value=1; 

Die Abfrage gibt keine Sortierung der zurückgegebenen Zeilen an.

SQL ist eine Sprache, die Sätze von Tupeln behandelt und a set ist per Definition eine ungeordnete Sammlung von Elementen.

Die Tatsache, dass eine Datenbank-Engine unter bestimmten Umständen die Zeilen in einer bestimmten Reihenfolge zurückgibt (sortiert nach dem Wert PK f.e.) ist ein Implementierungsdetail. Es wird von der Sprache nicht benötigt und kann jederzeit geändert werden.

Noch mehr, wenn die Abfrage keine Reihenfolge für die zurückgegebenen Zeilen angibt, verwendet die Datenbank-Engine die jeweils geeignete Methode, um sie schneller zu erhalten. Die Reihenfolge kann von externen Faktoren abhängen und sich mit der Zeit ändern. Wenn Sie beispielsweise die von der Abfrage zurückgegebenen Zeilen aus der Tabelle entfernen und sie dann erneut einfügen, aber in einer anderen Reihenfolge, kann eine nachfolgende Ausführung der gleichen Abfrage (und höchstwahrscheinlich) die Zeilen in einer anderen Reihenfolge als zuvor zurückgeben.

Als Einsicht (das ist weder genau noch zuverlässig), für eine Abfrage, die keine ORDER BY Klausel über eine kleine Tabelle enthält, gibt die Datenbank die Zeilen in der Reihenfolge sie sie in den Tabellendaten, weil sie findet liest den Index nicht.

Bei kleinen Tabellen überspringt der Motor den Index, wenn er nicht benötigt wird und geht direkt zu den Tabellendaten. Auf diese Weise wird ein Festplattenzugriff erspart, der der Verarbeitung keinen zusätzlichen Wert bietet.

0
select * from ABC order by ID where column_value=1; 

können Sie order by Funktion verwenden, um das gewünschte Ergebnis zu erhalten.

Verwandte Themen