Załóżmy, że mam atrybut o nazwie numer telefonu i chciałbym wprowadzić pewną ważność w odniesieniu do wpisów w tym polu. Czy mogę użyć do tego celu wyrażenia regularnego, ponieważ Wyrażenie regularne jest bardzo elastyczne przy definiowaniu wiązań.Czy możliwe jest egzekwowanie sprawdzania danych w MySQL przy użyciu wyrażenia regularnego
Odpowiedz
Tak, możesz. MySQL obsługuje regex (http://dev.mysql.com/doc/refman/5.6/en/regexp.html) i do sprawdzania poprawności danych należy użyć wyzwalacza, ponieważ MySQL nie obsługuje ograniczenia CHECK (zawsze możesz przejść do PostgreSQL jako alternatywy :). NB! Należy pamiętać, że nawet jeśli MySQL ma konstrukcję ograniczenia CHECK, niestety MySQL (do tej pory 5.6) nie sprawdza poprawności danych względem ograniczeń sprawdzania. Według http://dev.mysql.com/doc/refman/5.6/en/create-table.html: "Klauzula CHECK jest analizowana, ale ignorowana przez wszystkie silniki magazynujące."
Możesz dodać ograniczenie wyboru do kolumny telefon:
CREATE TABLE data (
phone varchar(100)
);
DELIMITER $$
CREATE TRIGGER trig_phone_check BEFORE INSERT ON data
FOR EACH ROW
BEGIN
IF (NEW.phone REGEXP '^(\\+?[0-9]{1,4}-)?[0-9]{3,10}$') = 0 THEN
SIGNAL SQLSTATE '12345'
SET MESSAGE_TEXT = 'Wroooong!!!';
END IF;
END$$
DELIMITER ;
INSERT INTO data VALUES ('+64-221221442'); -- should be OK
INSERT INTO data VALUES ('+64-22122 WRONG 1442'); -- will fail with the error: #1644 - Wroooong!!!
Jednak nie należy polegać jedynie na MySQL (warstwy danych w Twoim przypadku) do sprawdzania poprawności danych. Dane powinny zostać zweryfikowane na wszystkich poziomach aplikacji.
Dzięki. Tego właśnie szukałem. Rozumiem, że wszystkie sprawdzania poprawności powinny być wykonywane na wszystkich warstwach, ale musiałem wiedzieć, jak to zrobić dla warstwy danych. –
Krótka odpowiedź: Tak, możesz. Czy możesz dodać więcej kontekstu? Czy chcesz filtrować to na wejściu? Jeśli tak, to dlaczego nie filtrować, gdy na przykład użytkownik zarejestruje się? – HamZa
@HamZaDzCyberDeV Nie, nie na wejściu. Chcę wymusić to w bazie danych. Rozumiem, że można to zrobić w warstwie aplikacji, zastanawiałem się, czy to samo możliwe było w warstwie bazy danych podczas tworzenia tabel. –
Podczas tworzenia tabeli musisz określić typ kolumny, nie ma typu "numer telefonu". Możesz spojrzeć na [wyzwalacze] (http://dev.mysql.com/doc/refman/5.6/en/triggers.html) – HamZa