Maison  >  Article  >  base de données  >  Comment garantir que les plages de dates ne se chevauchent pas dans la table « avail » de MySQL ?

Comment garantir que les plages de dates ne se chevauchent pas dans la table « avail » de MySQL ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-28 10:00:04306parcourir

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

MySQL : insertion d'une plage de dates dans les colonnes de dates uniquement si aucun chevauchement n'existe

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

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn