Я установил для столбца MySQL значение «NOT NULL», но все равно могу вставить пустое значение - PullRequest
9 голосов
/ 01 сентября 2011

В MySQL у меня есть таблица с Column1 как NOT NULL:

create table myTable 
(
    Column1 int not null,
    Column2 int not null
)

Я все еще могу вставить пустое значение следующим образом:

INSERT INTO `myTable` ( `Column1` ,  `Column2` )
VALUES ( '66', '' );

Как сделать так, чтобы столбец MySQL также запрещал пустую строку?

Ответы [ 5 ]

9 голосов
/ 01 сентября 2011

ПУСТЫЕ СТРОКИ

В ORACLE пустая строка используется для представления NULL. Однако практически во всем остальном пустая строка по-прежнему является строкой и поэтому не равна NULL.


INTS

В вашем случае вы фактически вставляете STRINGS в столбец INT. Это вызывает неявную CAST операцию.

Когда ваша СУБД преобразует строку '' в INT, она должна получить значение 0. Поскольку 0 не равно NULL, это вставляется.

Более действительный тест будет:

INSERT INTO `plekz`.`countries` (`Column1 ` , `Column2`)
VALUES (66, NULL);


EDIT

Извините, я только наполовину прочитал ваш вопрос. Вы также спрашиваете, как остановить вставку ''.

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

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

Технически доступный вариант - создать поля CHAR полей, а затем наложить ограничения на поля, предотвращая вставку ''. Я бы настоятельно рекомендовал бы против этого.

8 голосов
/ 01 сентября 2011

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

4 голосов
/ 18 марта 2014

MySQL, как запретить пустую строку:

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

    mysql> create table yar (val VARCHAR(25) not null);
    Query OK, 0 rows affected (0.02 sec)
    
  2. Создайте триггер «перед вставкой», чтобы проверить наличие пустой строки и запретить.

    mysql> create trigger foo before insert on yar
        -> for each row
        -> begin
        -> if new.val = '' then
        -> signal sqlstate '45000';
        -> end if;
        -> end;$$
    Query OK, 0 rows affected (0.01 sec)
    
  3. Попробуйте вставить пустую строку и пустую строку в ваш столбец:

    mysql> delimiter ;
    
    mysql> insert into yar values("");
    ERROR 1644 (45000): Unhandled user-defined exception condition
    
    mysql> insert into yar values(NULL);
    ERROR 1048 (23000): Column 'val' cannot be null
    
    mysql> insert into yar values ("abc");
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from yar;
    +-----+
    | val |
    +-----+
    | abc |
    +-----+
    1 row in set (0.00 sec)
    

Наконец, ворчите себе и чмокните ближайшего человека, который отвечал за выбор mysql вместо postgresql.

3 голосов
/ 01 сентября 2011

Как отмечает Мартин, зависит от вашей РСУБД. Oracle обрабатывает пустые строки как NULL, в то время как другие - нет. Смотрите это ТАК сообщение .

0 голосов
/ 07 октября 2013

NULL не равно пустоте. В MySQL есть дополнительный байт с каждой записью столбца для хранения информации «является нулем». Чтобы сэкономить место, столбец часто определяется как «не ноль», чтобы сэкономить этот дополнительный байт, если нулевой статус ничего не добавляет к модели данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...