posiadam taką tabelkę:
ID INT ID_ZASOB INT OD DATETIME DO DATETIM OPIS VARCHAR
Chciałbym zablokować możliwość dodawania rekordu w którym dany zasób w określonym przedziale czasu może być wykorzystany tylko raz. Zrobiłem coś co działa ale nie poprawnie:
BEGIN IF (NEW.DO <= NEW.OD) THEN INSERT INTO ERROR VALUES(`Zła data`); END IF; IF NEW.OD BETWEEN (SELECT ZASOBY.OD FROM ZASOBY WHERE ZASOBY.ID_OS = NEW.ID_OS) AND (SELECT ZASOBY.DO FROM ZASOBY WHERE ZASOBY.ID_OS = NEW.ID_OS) THEN INSERT INTO ERROR VALUES(`Zły przedział`); END IF; END
Takie coś działa tylko dla jednego rekordu z danym ID, jeżeli dodam kolejny rekord spełniający warunek to potem podzapytanie zwróci więcej wyników i nic z tego nie będzie. Myślałem żeby zastosować MAX ale też to nie da zamierzonego efektu.
Rozwiązanie:
BEGIN IF (NEW.DO <= NEW.OD) THEN INSERT INTO ERROR VALUES(`ZŁY PRZEDZIAŁ`); END IF; CREATE TEMPORARY TABLE IF NOT EXISTS `X` AS SELECT * FROM ZASOBY; SET @max1:= (SELECT MAX(ID)+1 FROM ZASOBY); INSERT INTO `X` (X.ID, X.ID_OS, X.OD, X.DO, X.OPIS) VALUES (@max1, NEW.ID_OS, NEW.OD, NEW.DO, NEW.OPIS); CREATE TEMPORARY TABLE IF NOT EXISTS `Y` AS SELECT * FROM ZASOBY; INSERT INTO `Y` (Y.ID, Y.ID_OS, Y.OD, Y.DO, Y.OPIS) VALUES (@max1, NEW.ID_OS, NEW.OD, NEW.DO, NEW.OPIS); SET @a:=(SELECT COUNT(*) FROM ( SELECT X.ID AS id1, '-', Y.ID AS id2 FROM X JOIN Y ON X.ID<Y.ID AND Y.OD<X.DO AND Y.DO>X.OD AND X.ID_OS = Y.ID_OS) AS E); IF @a>0 THEN INSERT INTO ERROR VALUES(`ZŁY PRZEDZIAŁ`); END IF; DROP TEMPORARY TABLES X,Y; END
Tabela ZASOBY musi posiadać przynajmniej jeden rekord wprowadzony przed ustawieniem wyzwalacza (ze względu na NULL w ID), Jak ktoś ma pomysł jak to zoptymalizować będę wdzięczny za sugestie.