ホームページ  >  記事  >  データベース  >  MySQL の「avail」テーブルで日付範囲が重複しないようにするにはどうすればよいですか?

MySQL の「avail」テーブルで日付範囲が重複しないようにするにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-28 10:00:04306ブラウズ

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

MySQL: 重複が存在しない場合にのみ日付列に日付範囲を挿入する

問題ステートメント

avail という名前のテーブルが指定された場合異なる acc_id の利用可能な日付範囲を保存するための目的は、同じ acc_id の既存の日付範囲と重複することなく、新しい日付範囲を検証して挿入することです。具体的には、開始日と終了日が既存の日付と一致するなど、あらゆる種類の重複を避ける必要があります。

提案されたソリューション

ワンステートメント アプローチ:

残念ながら、SQL CHECK 制約がないため、MySQL の単一の挿入ステートメントを使用してこの検証を実装することはできません。

代替アプローチ:

SQL トリガー:

SQL トリガーを使用すると、挿入または更新操作が実行される前にこの制約を強制できます。トリガーは、SIGNAL ステートメントを使用して重複する行をチェックし、エラーをスローします。ただし、このアプローチでは、最新バージョンの MySQL を使用する必要があります。

アプリケーション ロジック:

最も実用的なアプローチは、アプリケーション ロジック内で検証を実行することです。 。 SELECT COUNT(id) ステートメントを使用すると、新しい範囲に違反する行数を取得できます。カウントが 0 より大きい場合、挿入/更新操作は中止される必要があります。

挿入失敗のチェック:

影響を受ける行をチェックして、挿入が失敗したかどうかを判断できます。成功したか失敗したか。値 0 は失敗を示します。日付の重複またはその他の理由が考えられます。

例:

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

返されたカウントが 0 より大きい場合、挿入操作は実行しないでください。

以上がMySQL の「avail」テーブルで日付範囲が重複しないようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。