Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Sprawdzasz tabelę pod kątem nakładania się czasu?

To jest wzorzec zapytania, na który odpowiedź znalazłem wiele lat temu:

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

Aby znaleźć „dowolne nakładanie się”, porównaj przeciwne kończą się ze sobą w ramach czasowych. To coś, do czego musiałem wyciągnąć długopis i kartkę i narysować sąsiednie zakresy, aby zdać sobie sprawę, że skrajne przypadki sprowadzają się do tego porównania.

Jeśli chcesz zapobiec nakładaniu się wierszy, umieść wariant tego zapytania w wyzwalaczu:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak ustawić parametry ORDER BY za pomocą przygotowanej instrukcji PDO?

  2. Przykłady instrukcji JDBC — wstaw, usuń, zaktualizuj, wybierz rekord

  3. Optymalne ustawienia MySQL dla zapytań dostarczających duże ilości danych?

  4. Czy liczba może być użyta do nazwania kolumny tabeli MySQL?

  5. Rekurencja MySQL?