Heim >Datenbank >MySQL-Tutorial >Wie kann sichergestellt werden, dass sich Datumsbereiche in der „Avail'-Tabelle von MySQL nicht überschneiden?
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!