SQL (MySQL)-Frage: auf inkorrekte Werte prüfen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Hase
User
Beiträge: 56
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Montag 17. September 2018, 15:32

Hallo, keine Python-Frage, eine SQL-Frage:

Aus der MySQL-Doku:
MySQL permits you to store certain incorrect date values into DATE and DATETIME columns (such as '2000-02-31' or '2000-02-00').
Genau den Fall habe ich leider. Aber wie kann ich diese inkorrekten Werte denn erkennen? Bei einem normalen SELECT auf diesen falschen wird nämlich kein Fehler ausgeworfen, sondern erst, wenn man sowas macht wie ALTER TABLE ...., dann wird die erste falsche ROW angemeckert.

Ich bräuchte sowas wie:

SELECT id FROM mytable WHERE mydate=INCORRECT;

Gibt es sowas?

Grüße I.H.
Hase
User
Beiträge: 56
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Donnerstag 27. September 2018, 14:07

Da beantworte ich mal meine eigene Frage.

Ich habe viel gesucht, aber nichts wirklich gutes gefunden. Das Problem scheint bekannt, es gibt recht viele Fragen dazu, aber m.E. keine guten Lösungen.

In alten MySQL-Versionen war es wohl erlaubt, ein falsches Datum anzugeben, oder es wurde gar nicht geprüft. In neueren Versionen ist der Default, es nicht zu erlauben, was ja auch sinnvoll ist. Das alte Verhalten mit erlaubten falschen Daten lässt sich temporär durch

set session sql_mode='';

erzwingen, indem eben in der laufenden Session der Default ausgeschaltet wird. Auch in meiner DB sind nur alte Datensätze betroffen (so 10 Jahre und älter).

Meine Lösung:
ein kleines Python-Programm, alle Datensätze durchgehen und versuchen, das vorhandene Datum noch mal neu zu schreiben (UPDATE ....) . Kommt es zu einer Exception, dort ein gültiges Datum oder NONE setzen. Jetzt ist der Spuk vorbei. Letztlich hat die Sucherei mehr Zeit gekostet als die 20 Zeilen Python zu schreiben.
Antworten