Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Memastikan Julat Tarikh Tidak Bertindih dalam Jadual `avail` MySQL?

Bagaimana untuk Memastikan Julat Tarikh Tidak Bertindih dalam Jadual `avail` MySQL?

Patricia Arquette
Patricia Arquetteasal
2024-10-28 10:00:04306semak imbas

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

MySQL: Memasukkan Julat Tarikh ke dalam Lajur Tarikh Hanya jika Tiada Pertindihan Wujud

Pernyataan Masalah

Diberikan jadual bernama avail yang menyimpan julat tarikh ketersediaan untuk acc_id yang berbeza, objektifnya adalah untuk mengesahkan dan memasukkan julat tarikh baharu tanpa bertindih yang sedia ada untuk acc_id yang sama. Khususnya, sebarang jenis pertindihan mesti dielakkan, termasuk tarikh mula dan tamat yang sepadan dengan tarikh sedia ada.

Penyelesaian Cadangan

Pendekatan Satu Pernyataan:

Malangnya, pengesahan ini tidak boleh dilaksanakan menggunakan satu pernyataan sisipan dalam MySQL kerana kekurangan kekangan SQL CHECK.

Pendekatan Alternatif:

Pencetus SQL:

Pencetus SQL boleh digunakan untuk menguatkuasakan kekangan ini sebelum operasi sisipan atau kemas kini dilakukan. Pencetus akan menyemak baris yang bertindih dan membuang ralat menggunakan pernyataan SIGNAL. Walau bagaimanapun, pendekatan ini memerlukan penggunaan versi MySQL yang terkini.

Logik Aplikasi:

Pendekatan paling praktikal ialah melakukan pengesahan dalam logik aplikasi . Pernyataan SELECT COUNT(id) boleh digunakan untuk mendapatkan semula bilangan baris yang akan dilanggar oleh julat baharu. Jika kiraan lebih besar daripada 0, operasi sisipan/kemas kini hendaklah dihentikan.

Menyemak Kegagalan Sisipan:

Baris yang terjejas boleh disemak untuk menentukan sama ada sisipan telah berjaya atau gagal. Nilai 0 menunjukkan kegagalan, yang mungkin disebabkan pertindihan tarikh atau sebab lain.

Contoh:

<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>

Jika kiraan yang dikembalikan lebih besar daripada 0 , operasi sisipan tidak sepatutnya dilakukan.

Atas ialah kandungan terperinci Bagaimana untuk Memastikan Julat Tarikh Tidak Bertindih dalam Jadual `avail` MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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