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!