首頁  >  文章  >  資料庫  >  如何確保 MySQL 的「avail」表中的日期範圍不重疊?

如何確保 MySQL 的「avail」表中的日期範圍不重疊?

Patricia Arquette
Patricia Arquette原創
2024-10-28 10:00:04396瀏覽

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

MySQL:只有當不存在重疊時才將日期範圍插入日期欄位

問題陳述

給定一個一個>問題陳述

給定一個名為avail的表儲存不同acc_id 的可用性日期範圍,目的是驗證和插入新的日期範圍,而不與同一acc_id 的現有日期範圍重疊。具體來說,必須避免任何類型的重疊,包括與現有日期相符的開始日期和結束日期。

建議的解決方案

單語句方法:

遺憾的是,由於缺乏SQL CHECK 約束,不可能在MySQL 中使用單一插入語句來實現此驗證。

替代方法:

SQL 觸發器:

SQL 觸發器可用於在執行插入或更新操作之前強制執行此約束。觸發器將檢查重疊行並使用 SIGNAL 語句拋出錯誤。但是,這種方法需要使用最新版本的 MySQL。

應用程式邏輯:

最實用的方法是在應用程式邏輯中執行驗證。 SELECT COUNT(id) 語句可用來擷取新範圍違反的行數。如果計數大於 0,則應中止插入/更新操作。

檢查插入失敗:

可以檢查受影響的行以確定是否插入是成功還是失敗。值為 0 表示失敗,可能是由於日期重疊或其他原因。

<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>
範例:

如果回傳的計數大於 0 ,則不應執行插入操作。

以上是如何確保 MySQL 的「avail」表中的日期範圍不重疊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn