MySQL GROUP BY Gotcha

Ich will hier kurz ein Gotcha vorstellen, das bei der Verwendung von Group By unter MySQL auftreten kann und dann ein Gegenbeispiel in PostgreSQL bringen.

Nehmen wir folgende Tabelle an:


O_Id OrderDate OrderPrice Customer
1 2008/11/12 1000 Hansen
2 2008/10/23 1600 Nilsen
3 2008/09/02 700 Hansen
4 2008/09/03 300 Hansen
5 2008/08/30 2000 Jensen
6 2008/10/04 100 Nilsen

Dann wäre das folgende Query gültig und hilfreich um die Summe für einen Kunden zu bestimmen:


$ SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
Customer SUM(OrderPrice)
Hansen 2000
Nilsen 1700
Jensen 2000

Hierbei befinden sich alle angezeigten Felder in dem GROUP BY Ausdruck oder in einer Aggregatfunktion.

Unter MySQL ist jedoch auch folgendes möglich:


SELECT * FROM Orders GROUP BY Customer

Hierbei würde nach Kunde Gruppiert, sowie alle anderen Felder angezeigt werden. Allerdings ist hierbei *nicht definiert welche Werte die nicht gruppierten Felder haben!* Siehe dazu auch MYSQL: GROUP BY mit versteckten Feldern. Hier wird dies „Feature“ genannt und muss explizit deaktiviert werden …

Unter PostgreSQL bekommt man jedoch standardmäßig folgende Fehlermeldung die einem vor so manchem Fehler bewahren kann:


$ SELECT * FROM Orders GROUP BY Customer;
ERROR: column "Orders.O_Id" must appear in the GROUP BY clause or be used in an aggregate function

Quellen:

Advertisements

mysqldump und auto_increment

Diesmal ein Post aus einer etwas anderen Kategorie. Es scheint als wäre mysqldump etwas zickig was das Spaltenargument auto_increment angeht.

Da es sich hierbei um eine nicht SQL Standard konforme Option handelt, ist der Gedanke diesen bei der Ausgabe von „kompatiblem SQL“ nicht anzugeben durchaus lobenswert. So lässt mysqldump diese Anweisungen nämlich außen vor, wenn das –compatible Flag gesetzt ist. Allerdings kann man mit den meisten Tabellen nach einem import nicht mehr viel anfangen, da wieder manuell ein auto_increment gesetzt werden müsste.

Und weil das nicht genug ist lässt mysqldump das Argument nicht nur bei –compatible weg sondern auch bei –skip-opt, was unter anderem dazu verwendet werden kann um Tabellen beim Dumpen nicht zu locken.

Abhilfe kann man sich evtl. dadurch schaffen, dass man statt –skip-opts nur die spezifischen Flags wie –skip-opt –lock-tables verwendet.

Hier ein Bugreport und User Group Eintrag dazu.