MySQL вставить запрос с пропущенными ненулевыми полями - PullRequest
0 голосов
/ 09 июня 2011

Я сейчас пытаюсь использовать Object Relational Mapper для CodeIgniter, и я испытываю то, чего не ожидал.

У меня есть таблица с парой полей, некоторые из которых не имеют значения NULL. Запрос вставки, в котором отсутствует поле NOT NULL, создается - добавляется новая строка, но с пробелами для этих полей.

Я не знал, что MySQL игнорирует поля NOT NULL, которых нет в запросе, и все равно вставит строку. Есть ли способ ограничить это?

- Редактировать -

Позвольте мне добавить еще несколько деталей и попытаться объяснить это немного подробнее

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

CREATE TABLE `test` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `color` varchar(40) COLLATE utf8_bin DEFAULT '',
 `shape` varchar(40) COLLATE utf8_bin NOT NULL,
 `size` varchar(40) COLLATE utf8_bin NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

Вот пример запроса:

INSERT INTO `test` (`shape`) VALUES ('foo')

У меня нет size в моем запросе, но он все еще добавляет строку - это ожидается?

(пример запроса был запущен в phpMyAdmin)

Ответы [ 3 ]

3 голосов
/ 09 июня 2011

Пустая строка - это не то же самое, что NULL. Возможно, ORM вставляет только '' для этих полей.

2 голосов
/ 16 апреля 2013

Я считаю, что принятый ответ неверен, учитывая тестовое утверждение INSERT. Мне кажется, что строгий режим MySQL отключен для этой таблицы или базы данных. От Документы :

Строгий режим управляет тем, как MySQL обрабатывает входные значения, которые являются недопустимыми или отсутствует ... Значение отсутствует, когда новая вставляемая строка не содержит значения для столбца, отличного от NULL, который не имеет явное предложение DEFAULT в его определении ...

Если вы не используете строгий режим (то есть не включены ни STRICT_TRANS_TABLES, ни STRICT_ALL_TABLES), MySQL вставляет скорректированные значения для недопустимых или отсутствующих значений и выдает предупреждения.

Вы можете узнать, как ваша база данных работает с этими запросами:

SELECT @@global.sql_mode;
SELECT @@session.sql_mode;

Изменение этих значений обсуждается здесь: https://stackoverflow.com/a/5273824/27846

1 голос
/ 09 июня 2011

Не разработчик кода, но я бы рискнул предположить, что проблема в том, что ваш ORM передает пустые значения в базу данных, я бы проверил ваши журналы, чтобы убедиться в этом, и если это так, проверьте ваш ORM, если он имеет некоторые параметры проверки.

...