Heim  >  Artikel  >  Datenbank  >  Wie kann sichergestellt werden, dass sich Datumsbereiche in der „Avail“-Tabelle von MySQL nicht überschneiden?

Wie kann sichergestellt werden, dass sich Datumsbereiche in der „Avail“-Tabelle von MySQL nicht überschneiden?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-28 10:00:04306Durchsuche

How to Ensure Non-Overlapping Date Ranges in MySQL's `avail` Table?

MySQL: Datumsbereich nur dann in Datumsspalten einfügen, wenn keine Überlappung vorhanden ist

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn