Problemstellung
Gegeben sei eine Tabelle mit dem Namen avail Das Ziel ist die Validierung und das Einfügen neuer Datumsbereiche, ohne dass sich bestehende für dieselbe Acc_ID überschneiden. Insbesondere muss jede Art von Überschneidung vermieden werden, einschließlich Start- und Enddaten, die mit den bestehenden übereinstimmen.
Vorgeschlagene Lösung
One-Statement-Ansatz:
Bedauerlicherweise ist es aufgrund fehlender SQL CHECK-Einschränkungen nicht möglich, diese Validierung mit einer einzigen Einfügeanweisung in MySQL zu implementieren.
Alternative Ansätze:
SQL-Trigger:
Ein SQL-Trigger kann verwendet werden, um diese Einschränkung zu erzwingen, bevor der Einfüge- oder Aktualisierungsvorgang ausgeführt wird. Der Trigger würde nach überlappenden Zeilen suchen und mithilfe der SIGNAL-Anweisung einen Fehler auslösen. Dieser Ansatz erfordert jedoch die Verwendung einer aktuellen Version von MySQL.
Anwendungslogik:
Der praktischste Ansatz besteht darin, die Validierung innerhalb der Anwendungslogik durchzuführen . Eine SELECT COUNT(id)-Anweisung kann verwendet werden, um die Anzahl der Zeilen abzurufen, die durch den neuen Bereich verletzt würden. Wenn die Anzahl größer als 0 ist, sollte der Einfüge-/Aktualisierungsvorgang abgebrochen werden.
Prüfung auf Einfügungsfehler:
Betroffene Zeilen können überprüft werden, um festzustellen, ob die Einfügung erfolgt ist war erfolgreich oder scheiterte. Ein Wert von 0 weist auf einen Fehler hin, der auf eine Datumsüberschneidung oder andere Gründe zurückzuführen sein kann.
Beispiel:
<code class="sql">SELECT COUNT(id) FROM avail WHERE acc_id = <new_acc_id> AND ( (start_date <= <new_start_date> AND end_date >= <new_start_date>) OR (start_date <= <new_end_date> AND end_date >= <new_end_date>) );</code>
Wenn die zurückgegebene Anzahl größer als 0 ist , der Einfügevorgang sollte nicht ausgeführt werden.
Das obige ist der detaillierte Inhalt vonWie kann sichergestellt werden, dass sich Datumsbereiche in der „Avail'-Tabelle von MySQL nicht überschneiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!