sql >> データベース >  >> RDS >> Mysql

テーブルの時間の重複をチェックしていますか?

    これは、私が何年も前に答えを見つけたクエリパターンです:

    SELECT *
    FROM mytable a
    JOIN mytable b on a.starttime <= b.endtime
        and a.endtime >= b.starttime
        and a.name != b.name; -- ideally, this would compare a "key" column, eg id
    

    「重複」を見つけるには、反対を比較します。 お互いに時間枠の終わり。これは、エッジケースがこの比較に要約されていることを理解するために、ペンと紙を取り出して隣接する範囲を描画する必要があったものです。

    行が重ならないようにする場合は、このクエリのバリアントをトリガーに入れます。

    create trigger mytable_no_overlap
    before insert on mytable
    for each row
    begin
      if exists (select * from mytable
                 where starttime <= new.endtime
                 and endtime >= new.starttime) then
        signal sqlstate '45000' SET MESSAGE_TEXT = 'Overlaps with existing data';
      end if;
    end;
    


    1. 列ストアプラン

    2. PostgreSQLのSlonyレプリケーションに関するエキスパートガイド

    3. SQLServerでGUIを使用して列を追加または削除する方法-SQLServer/T-SQLチュートリアルパート39

    4. クエリを介してMySQLでデータベース構造を取得する方法