#mysql #regex #triggers
#mysql #регулярное выражение #триггеры
Вопрос:
Я знаю, что могу создавать базовые триггеры сравнения (см. Ниже)
CREATE TRIGGER HospitalCheck
BEFORE INSERT ON Hospital
FOR EACH ROW
BEGIN
IF NEW.HospitalID > 9999 THEN
call fail('HOSPITAL CODE INVALID');
END IF;
END
Как бы мне использовать регулярное выражение, которое допускает только числа? (вместо >9999)
(эквивалент SELECT string для проверки РЕГУЛЯРНОГО выражения ‘^[0-9] $’)
Я пытался:
IF NEW.HospitalID REGEX '^[0-9] $' THEN
call fail('HOSPITAL CODE INVALID');
END IF;
Но я получаю
: ОШИБКА: —> #1064 — У вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘REGEX’ ^[0-9] $’ ЗАТЕМ вызовите fail (‘НЕВЕРНЫЙ КОД БОЛЬНИЦЫ’); ЗАВЕРШИТЕ IF’ в строке 5
Комментарии:
1. Да, но я получаю синтаксическую ошибку
2.
IF NEW.HospitalID REGEX '^[0-9] $' THEN
call fail('HOSPITAL CODE INVALID');
END IF;
END
: ОШИБКА: —> #1064 — У вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘REGEX’ ^[0-9] $’ ЗАТЕМ вызовите fail (‘НЕВЕРНЫЙ КОД БОЛЬНИЦЫ’); ЗАВЕРШИТЕ IF’ в строке 53. Это регулярное выражение отметит его недействительным, если оно числовое. Либо замените РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ (должно быть REGEXP) на NOT_REGEXP, либо используйте ‘^[^0-9] $’
4. кстати, я надеюсь, вы не планируете использовать это в
CHECK
инструкции … xD
Ответ №1:
Функция NOT_REGEXP — смотрите документы http://dev.mysql.com/doc/refman/5.1/en/regexp.html
IF colname NOT_REGEXP '^[0-9] $' THEN
Комментарии:
1. Прошу прощения, если я был неясен, я спрашивал, как бы я заменил IF NEW. HospitalID > 9999 ЗАТЕМ <— из приведенного выше кода с эквивалентом РЕГУЛЯРНОГО выражения, который допускает только числа
2. Вот почему я указал вам на функцию. Вам было бы полезно реализовать функцию из документации, а не заставлять кого-то писать ее за вас 🙂
Ответ №2:
ЕСЛИ НЕТ РЕГУЛЯРНОГО выражения с именем столбца ‘^[0-9] $’, ТО
Ответ №3:
Просто измените регулярное выражение
IF NEW.HospitalID REGEX '^[^0-9] $' THEN
call fail('HOSPITAL CODE INVALID');
END IF;
Объяснение
- Первый символ каретки обозначает начало идентификатора больницы.
- квадратная скобка [ обозначает начало символьного класса
- Второй символ каретки обозначает все символы, кроме от нуля до 9
- конечная квадратная скобка обозначает конец символьного класса
- символ со знаком плюс означает, что символов класса character должно быть один или несколько
- символ доллара обозначает конец переменной HospitalID.
Итак, вкратце, это регулярное выражение проверяет переменную HospitalID, и если оно обнаруживает, что переменная HospitalID содержит не числовые символы, оно вызывает функцию fail.