Maison > Article > base de données > Comment garantir que les plages de dates ne se chevauchent pas dans la table « avail » de MySQL ?
Énoncé du problème
Étant donné une table nommée Avail qui stocke les plages de dates de disponibilité pour différents acc_ids, l'objectif est de valider et d'insérer de nouvelles plages de dates sans chevaucher celles existantes pour le même acc_id. Plus précisément, tout type de chevauchement doit être évité, y compris les dates de début et de fin qui correspondent à celles existantes.
Solution proposée
Approche en une seule déclaration :
Malheureusement, il n'est pas possible d'implémenter cette validation à l'aide d'une seule instruction d'insertion dans MySQL en raison du manque de contraintes SQL CHECK.
Approches alternatives :
Déclencheur SQL :
Un déclencheur SQL peut être utilisé pour appliquer cette contrainte avant que l'opération d'insertion ou de mise à jour ne soit effectuée. Le déclencheur vérifierait les lignes qui se chevauchent et générerait une erreur à l'aide de l'instruction SIGNAL. Cependant, cette approche nécessite l'utilisation d'une version à jour de MySQL.
Logique de l'application :
L'approche la plus pratique consiste à effectuer la validation dans la logique de l'application . Une instruction SELECT COUNT(id) peut être utilisée pour récupérer le nombre de lignes qui seraient violées par la nouvelle plage. Si le nombre est supérieur à 0, l'opération d'insertion/mise à jour doit être interrompue.
Vérification de l'échec de l'insertion :
Les lignes affectées peuvent être vérifiées pour déterminer si l'insertion a réussi ou échoué. Une valeur de 0 indique un échec, qui pourrait être dû à un chevauchement de dates ou à d'autres raisons.
Exemple :
<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>
Si le nombre renvoyé est supérieur à 0 , l'opération d'insertion ne doit pas être effectuée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!