MYSQL вставить ноль для ненулевого столбца по умолчанию - PullRequest
2 голосов
/ 16 апреля 2020

Мне любопытно, почему в некотором не нулевом столбце уже установлено значение по умолчанию, но во время сценария вставки sql он выдаст ошибку.

Вот пример таблицы

drop table if exists `delivery`;
create table `delivery`(
    `price` BIGINT not null default 0,
    `created_time` TIMESTAMP(6) not null default CURRENT_TIMESTAMP (6)
) ENGINE=INNODB DEFAULT CHARSET=UTF8MB4
;

Допустим, выполнив три оператора ниже, только второй оператор не выдаст ошибку

insert into `delivery` (`price`,`created_time`) values (null, null);
insert into `delivery` (`price`,`created_time`) values (1, null);
insert into `delivery` (`price`,`created_time`) values (null, now());

Так есть ли в любом случае вставить нуль для столбца типа данных bigint и заставить его успешно выполнить? И любые идеи по логике c позади.

1 Ответ

1 голос
/ 16 апреля 2020

Невозможно вставить нулевые значения, поскольку у вас есть ограничения NOT NULL на столбцы.

Первый и третий оператор выдают ошибку, поскольку вы пытаетесь вставить нулевое значение в столбец price и / или created_time, и это явно не удовлетворяет ограничениям.

Если вы действительно хотите разрешить нулевые значения, то удалите ограничение NOT NULL для столбца (-ов).

В качестве альтернативы, вы можете успешно выполнить свои SQL операторы, как показано ниже:

insert into `delivery` () values ();
insert into `delivery` (`price`) values (1);
insert into `delivery` (`created_time`) values (now());

select * from `delivery`;

Результат:

price  created_time              
-----  --------------------------
    0  2020-04-16 09:48:23.505147
    1  2020-04-16 09:48:25.549202
    0  2020-04-16 09:48:26.0     

РЕДАКТИРОВАТЬ :

Второй запрос фактически завершается MySQL 5.7; он молча игнорирует явное нулевое значение и использует значение по умолчанию.

Похоже, что поведение было исправлено в MySQL 8.x, поскольку теперь происходит сбой (как и должно быть).

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