問題陳述
給定一個一個>問題陳述
給定一個名為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>
以上是如何確保 MySQL 的「avail」表中的日期範圍不重疊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!