21.10.2009
MySQL BEFORE INSERT Trigger als Check Constraint
Da MySQL weder echte Check Constraints noch eine Möglichkeit bietet, in einer Stored Procedure eine Exception auszulösen, war es nicht sofort offensichtlich, wie man eine bestimmte Zeile beim Einfügen anhand einer Bedingung ablehnen kann.
Ein eleganter Ansatz, den wir gefunden haben: Man setzt den betreffenden Wert basierend auf der Bedingung auf NULL und lässt den NOT NULL Constraint den Rest erledigen.
ALTER TABLE sessions MODIFY session_id varchar(255) NOT NULL;
DROP TRIGGER IF EXISTS check_sessionid;
DELIMITER $$
CREATE TRIGGER check_sessionid BEFORE INSERT ON sessions
FOR EACH ROW BEGIN
IF NOT NEW.session_id REGEXP '^[[:xdigit:]]{32}$' THEN
SET NEW.session_id = NULL;
END IF;
END;
$$
DELIMITER ;
Der Trigger lässt nur 32-stellige Strings mit ausschließlich HEX-Zeichen für die Spalte session_id durch und weist den Rest ab.
> INSERT INTO sessions (session_id) VALUES ('ffffffffffffffffffffffffffffffff');
Query OK, 1 row affected (0.01 sec)
> INSERT INTO sessions (session_id) VALUES ('fffffffffffffffffffffffffffffffg');
ERROR 1048 (23000): Column 'session_id' cannot be null
Happy triggering.