Liebe Mitdenker,
liebe Wissende,
liebe Neugierige,
ja!
Eintrag in eine Tabelle der DB. In einer Spalte stehen bei einigen Zeilen Filebezeichner. Nicht jede Zeile muss einen haben, das Feld kann also leer bleiben. Wenn es aber ausgefüllt ist, darf der Wert in der Spalte nur einmal vorkommen.
Wie kann ich das regeln? Unique Index gibt einen Fehler, weil doch manche Zeilen NULL oder Leerstring enthalten (habe ich beides ausprobiert).
NULL ist kein Problem und kann auch in einem Unique Index mehrfach vorkommen. Leerstring ist hingegen ein Wert wie jeder andere und der darf dann nur einmal drin sein.
Käse, jetzt habe ich schon die Trigger erweitert.
Das mit NULL hat vermutlich nicht gepasst, weil bei der Übergabe über die PHP-Datenbankschnittstelle grundsätzlich mysqli_real_escape_string() für Stringfelder benutzt wird. Da haben die NULL nicht vorgesehen. Ich fass das auch besser nicht an.
Da aber sowieso je ein Trigger für before_insert und before_update da ist, und die Fehlerroutinen (Exception-Handler) schon drin sind in der API, ist der Eingriff nicht so gravierend und leicht dokumentierbar.
Es klappt auch wunderbar. Ich weiß nur nicht, wie sich das auf die Performance auswirkt, wenn die Tabelle voller wird. Ich habe aber vorsorglich noch einen normalen Index auf die Spalte gesetzt.
Ich müsste nur nochmal ausprobieren, ob das Subselect genauso case-insensitiv ist, wie ein normales select. Da steht ja jetzt:
...
ELSEIF LENGTH(trim(NEW.`text`)) = 0 THEN
SET msg = concat('9002: Text is missing: ');
SIGNAL sqlstate '45002' SET message_text = msg;
ELSEIF (length(NEW.`imagelink`) > 0)
AND ((select count(*) from `guestbook` where `imagelink` = NEW.`imagelink`) > 0) THEN
SET msg = concat('9003: `imagelink already exists: ');
SIGNAL sqlstate '45003' SET message_text = msg;
ELSE
...
Spirituelle Grüße
Euer Robert
Möge der Forumsgeist wiederbelebt werden!