Rumah > pangkalan data > tutorial mysql > Bagaimanakah Kekangan EXCLUDE PostgreSQL Dapat Menghalang Entri Julat Tarikh/Masa Bertindih dan Bersebelahan?

Bagaimanakah Kekangan EXCLUDE PostgreSQL Dapat Menghalang Entri Julat Tarikh/Masa Bertindih dan Bersebelahan?

Barbara Streisand
Lepaskan: 2025-01-04 00:30:38
asal
940 orang telah melayarinya

How Can PostgreSQL's EXCLUDE Constraint Prevent Overlapping and Adjacent Date/Time Range Entries?

Mencegah Entri Bersebelahan/Bertindih dengan EXCLUDE dalam PostgreSQL

Masalah:

Apabila membuat pangkalan data untuk menyimpan julat tarikh/masa sewenang-wenangnya, matlamatnya adalah untuk mengelakkan pertindihan dan entri bersebelahan. Kekangan menggunakan klausa EXCLUDE dan indeks GiST digunakan, tetapi timbul kebimbangan mengenai andaian resolusi kedua.

Penyelesaian 1: Andaikan Resolusi Kedua

Jika permohonan hanya memerlukan resolusi kedua, dengan mengandaikan ini dalam kekangan mungkin mencukupi. Walau bagaimanapun, jenis data peleraian yang lebih tinggi mungkin memerlukan penyelesaian yang lebih mantap.

Penyelesaian 2: Sempadan Inklusif

Sempadan inklusif ([]) untuk julat bawah dan atas membenarkan pengesanan bertindih dengan kekangan CHECK menggunakan fungsi julat. Kekangan EXCLUDE dengan && memastikan tidak bertindih, manakala kekangan CHECK lain menguatkuasakan sempadan inklusif.

Penyelesaian 3: Sempadan Kanonik

Sempadan Kanonik ([)] memudahkan bukan- bertindih melalui kekangan EXCLUDE dengan &&. Selain itu, pengendali bersebelahan (-|-) digunakan dalam kekangan EXCLUDE berasingan untuk melarang masukan bersebelahan. Kekangan SEMAK memastikan nilai terikat yang sesuai.

Butiran Pelaksanaan:

-- Solution 2: Inclusive Bounds
CREATE TABLE tbl (
  tbl_id serial PRIMARY KEY,
  tsr tsrange,
  CONSTRAINT tsr_no_overlap  EXCLUDE USING gist (tsr WITH &&),
  CONSTRAINT tsr_enforce_incl_bounds CHECK (lower_inc(tsr) AND upper_inc(tsr))
);

-- Solution 3: Canonical Bounds
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))
);
Salin selepas log masuk

Cadangan:

Penyelesaian 3 menawarkan penyelesaian yang mantap untuk mengendalikan kedua-dua entri bertindih dan bersebelahan, tanpa mengira resolusi keperluan.

Atas ialah kandungan terperinci Bagaimanakah Kekangan EXCLUDE PostgreSQL Dapat Menghalang Entri Julat Tarikh/Masa Bertindih dan Bersebelahan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan