Ограничение для предотвращения вставки пустой строки в MySQL

В этом вопросе я изучил, как предотвратить вставку Нулевого значения. Но к сожалению, пустая строка вставляется так или иначе. Кроме предотвращения этого на стороне PHP, я хотел бы использовать что-то как ограничение базы данных для предотвращения этого. Конечно, проверка на стороне приложения необходима, но я хотел бы, чтобы она была с обеих сторон.

Мне преподают, что независимо от того, что приложение говорит с Вашей базой данных, оно не должно мочь вставить в основном неправильные данные в него. Так...

CREATE TABLE IF NOT EXISTS tblFoo (
  foo_id int(11) NOT NULL AUTO_INCREMENT,
  foo_test varchar(50) NOT NULL,
  PRIMARY KEY (foo_id)
);

Все еще позволил бы мне делать эту вставку:

INSERT INTO tblFoo (foo_test) VALUES ('');

Который я хотел бы предотвратить.

31
задан Cœur 22 April 2018 в 06:23
поделиться

2 ответа

Обычно вы делаете это с ограничением CHECK:

foo_test VARCHAR(50) NOT NULL CHECK (foo_test <> '')

К сожалению, MySQL имеет ограниченную поддержку ограничений. Из Справочное руководство MySQL :

Предложение CHECK анализируется, но игнорируется всеми механизмами хранения.

Вот почему вы должны использовать триггеры в качестве обходного пути, как отмечали люди.

В будущем вы, возможно, захотите взглянуть на PostgreSQL , который, как считается многими людьми, лучше поддерживает целостность данных (среди прочего ) .

20
ответ дан 27 November 2019 в 22:43
поделиться

Вы можете использовать триггеры для предотвращения вставки пустой строки.

Это не быстро, не очень лаконично и не красиво, но...

Пример:

  1. Создайте таблицу:

    mysql> create table yar (val VARCHAR(25) not null);
    Запрос OK, 0 строк обработано (0.02 сек)
    
  2. Создайте триггер 'before insert' для проверки на наличие пустой строки и запрета.

    mysql> delimiter $
    
    mysql> создайте триггер foo перед вставкой на yar
     -> для каждой строки
     -> begin
     -> if new.val = '' then
     -> signal sqlstate '45000';
     -> end if;
     -> end;$
    Запрос OK, 0 строк обработано (0.01 сек)
    
    mysql> разделитель ;
    
  3. Попробуйте вставить null и blankstring в ваш столбец:

    mysql> insert into yar values("");
    ОШИБКА 1644 (45000): Не обработанное пользовательское условие исключения
    
    mysql> insert into yar values(NULL);
    ERROR 1048 (23000): Столбец 'val' не может быть нулевым
    
    mysql> insert into yar values ("abc");
    Запрос OK, 1 строка затронута (0.01 сек)
    
    mysql> select * from yar;
    +-----+
    | val |
    +-----+
    | abc |
    +-----+
    1 строка в наборе (0.00 сек)
    
12
ответ дан 27 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: