Davon abgesehen, daß (auf den ersten Blick) Deine Prüfung wohl nicht alle möglichen Überschneidungsfälle abdeckt - die Realisierung in PG ist weit mächtiger. Neben dem Check auf Überlappung mit dem && - Operator kann man weitere Spalten auf z.B. Gleichheit nutzen. Damit könnte die Termintabelle für mehrere Leute gelten. Realisiert wird das in PG durch GiST - Indexe - die kann MySQL schon mal nicht. Die TRIGGER-Lösung mag (wenn man es richtig prüft...) funktionieren, aber definitiv nicht so effizient sein wie die Realisierung in PG. Sobald die Tabelle signifikant größer wird wird wohl der TRIGGER recht lange brauchen.
Ankündigung
Einklappen
Keine Ankündigung bisher.
Datetime und Überschneidungen in PHP
Einklappen
Neue Werbung 2019
Einklappen
X
-
Zitat von Meister1900 Beitrag anzeigenNur um mal zu zeigen, dass MySQL das auch kann:
Code:DELIMITER // CREATE TRIGGER check_dates BEFORE INSERT ON `t2` FOR EACH ROW BEGIN IF EXISTS ( SELECT beginn FROM t2 WHERE NEW.beginn < ende AND NEW.ende > beginn ) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Fehler! Termin-Überschneidung!'; END IF; END; // DELIMITER ;
Also überleg dir das nochmal mit dem Wechsel zu Postgre
Vielen Dank, ich denke ich mach erstmal damit weiter.. PostgreSQL scheint ein weniger anders zu sein, konnte gestern nicht mal die verbindung vom php aufbauen .
Habe ich damit alle überschneidungen abgedeckt, also mit deinem code
PHP-Code:IF EXISTS ( SELECT beginn FROM t2 WHERE NEW.beginn < ende AND NEW.ende > beginn ) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Fehler! Termin-Überschneidung!'; END IF; END; //
Wie könnte ich nur eine Anfrage Realisieren, hierbei wird ja direkt ein eintrag gemacht, ist es möglich mit Trigger ? nur eine Anfrage zu machen.. über Select hab ich ja wieder mein Problem...
Danke euch !.
lg
Kommentar
-
Zitat von deluxe13 Beitrag anzeigen
Vielen Dank, ich denke ich mach erstmal damit weiter.. PostgreSQL scheint ein weniger anders zu sein, konnte gestern nicht mal die verbindung vom php aufbauen .
Natürlich ist es anders - besser! Das mit der Verbindung: vermutlich hast Du vergessen, listen_adresses nicht zu setzen, und/oder pg_hba.conf nicht angepaßt.PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Kommentar
-
Zitat von akretschmer Beitrag anzeigenTrigger sind nicht für Abfrage, sondern "feuern" bei Insert, Update und Delete. Und bei DDL-Befehlen, sind dann sog. DDL-Trigger- Aber das führt hier zu weit ...
https://www.postgresql.org/docs/curr...reaterule.html
Davon abgesehen gelten Rules in PG (zumindest intern in der Community) als deprecated, please don't use it.PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Kommentar
-
Zitat von deluxe13 Beitrag anzeigenWie könnte ich eine einfache abfrage mit einem Trigger machen, ich finde dort nur die methoden zum löschen, update und einfügen
Option 1)
Du machst die Prüfung mit PHP vor dem INSERT als SELECT und wenn da ein Ergebnis kommt, führtst du das INSERT gar nicht erst aus.
Beispiele dazu findest du ja in diesem Thread genügend.
Option 2)
Du machst es wie gezeigt über den Trigger (oder bei PostgreSQL über die gaaaanz tollen Exclude Constraints) und fängst den Fehler, der dann von der Datenbank kommt, entsprechend mit PHP ab.
Dann sparst du dir die Prüfung im PHP Code komplett.
Falls du dich für Option 2 entscheidest und du Schwierigkeiten hast, kann ich dir auch später noch ein PHP Beispiel dazu posten.
Aber bitte nicht beide Varianten vermischen.sorry, shift-taste kaputt
- 1 Likes
Kommentar
-
Also Option 1 habe ich ja versucht, leider aber Fehler der aucj beschrieben ist in thread.
Zu Option 2 das mit dem trigger funktioniert soweit sehr gut, aber leider wird auch direkt ein Eintrag gemacht falls Termin frei. Ich möchte aber erstmal nur eine Anfrage machen ob Termin frei, und das scheint ja beim trigger so nicht möglich zu sein oder ?
Vielen Dank für deine Mühe und Hilfe
Kommentar
-
Zuletzt geändert von Meister1900; 14.09.2018, 20:24.Dafür brauchst du keinen Trigger, da reicht ein einfaches SELECT wie z.B.:
PHP-Code:SELECT EXISTS(SELECT beginn
FROM t2
WHERE '2018-09-11 15:00:00' < ende
AND '2018-09-11 22:00:00' > beginn) as termin_vorhanden
sorry, shift-taste kaputt
- 1 Likes
Kommentar
-
Hab meinen ersten Fehler gefunden... Warum es von Anfang nicht funktionieren konnte... Ich habe die variable als $starn gesetzt aber mit $startn versucht abzurufen Natürlich kann es. Nicht funktionieren. Siehe Seite 1 . Ich denke in meinem ersten Post hab ich auch alle Überschneidungen betrachtet.
Vielen vielen Dank !! Für eure Mühe.
Kommentar
Kommentar