Использование контрольного ограничения в MySQL для контроля длины строки - PullRequest
2 голосов
/ 12 июня 2010

У меня проблема!

Я установил первое ограничение проверки с использованием MySQL, но, к сожалению, у меня проблема. При вставке строки, которая должна пройти проверку, строка все равно вставляется.

Структура:

CREATE TABLE user (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  uname VARCHAR(10) NOT NULL,
  fname VARCHAR(50) NOT NULL,
  lname VARCHAR(50) NOT NULL,
  mail VARCHAR(50) NOT NULL,
  PRIMARY KEY (id),
  CHECK (LENGTH(fname) > 30)
);

Оператор вставки:

INSERT INTO user VALUES (null, 'user', 'Fname', 'Lname', 'mail@me.now');

Длина строки в столбце fname должна быть слишком короткой, но она все равно вставляется.

Я почти уверен, что мне здесь чего-то не хватает.

Ответы [ 2 ]

7 голосов
/ 12 июня 2010

MySQL не применяет ограничения CHECK на любом движке .
. Поэтому я спрашиваю, почему вы объявляете столбец fname как VARCHAR (50), но хотите применитьэто может быть только 30 символов в длину?

Тем не менее, единственной альтернативой является использование триггера:

CREATE TRIGGER t1 BEFORE INSERT ON user
 FOR EACH ROW BEGIN

   DECLARE numLength INT;
   SET numLength = (SELECT LENGTH(NEW.fname));

   IF (numLength > 30) THEN
     SET NEW.col = 1/0;
   END IF;

END;
0 голосов
/ 02 июня 2018

Как упоминалось выше, вы должны использовать триггер, MySQL не поддерживает check, также, когда у вас есть несколько операторов внутри вашего блока триггера, таких как объявление переменных или потоков управления, вы должны запустить его с begin иend и заключите свой триггер в два delimiters:

Примечание: Если вы используете MariaDB, используйте // после первого разделителя и перед вторым разделителем, в противном случае, если вы используете MySQLиспользуйте $$ вместо.

delimiter //

create trigger `user_insert_trigger` before insert on `user` for each row
begin
    declare maximumFnameLength int unsigned;
    declare fNameLength int unsigned;
    set maximumFnameLength = 30;
    set fNameLength = (select length(new.fNameLength));
    if (fNameLength > maximumFnameLength) then
        signal sqlstate '45000'
            set message_text = 'First name is more than 30 characters long.';
    end if;
end

//

delimiter ;
...