建立儲存任意日期/時間範圍的資料庫時,必須強制執行約束以防止條目重疊或相鄰。這些約束對於維護資料完整性和準確性至關重要。
在 PostgreSQL 中,EXCLUDE 約束透過利用 GiST 索引來實現此目的。然而,在定義這些約束時,人們普遍擔心一秒分辨率的假設。 PostgreSQL 中的時間戳記資料類型通常具有較高的分辨率,可能會導致不準確。
使用獨佔邊界的解決方案
要解決此問題並防止重疊和相鄰範圍,可以使用以下方法:建議在日期/時間範圍上強制執行獨佔邊界(“[)”)。這涉及透過 CHECK 約束包含下限(使用“lower_inc()”)並排除上限(“NOT upper_inc()”)。此外,若要排除相鄰範圍,可以使用另一個使用「-|-」運算子的 EXCLUDE 約束。
範例程式碼:
CREATE TABLE tbl ( tbl_id serial PRIMARY KEY , tsr tsrange , CONSTRAINT tsr_no_overlap EXCLUDE USING gist (tsr WITH &&) , CONSTRAINT tsr_no_adjacent EXCLUDE USING gist (tsr WITH -|-) , CONSTRAINT tsr_enforce_bounds CHECK (lower_inc(tsr) AND NOT upper_inc(tsr)) );
此解決方案確保僅允許具有獨佔邊界的範圍,有效防止重疊和相鄰條目。它還透過強制執行所需的範圍行為來確保資料完整性。
以上是PostgreSQL 的 EXCLUDE 約束如何防止重疊和相鄰的日期/時間範圍?的詳細內容。更多資訊請關注PHP中文網其他相關文章!