MySQL INSERT без необходимости указывать каждое поле не по умолчанию (# 1067 - Неверное значение по умолчанию для «таблицы») - PullRequest
4 голосов
/ 01 июня 2011

Я видел это несколько раз. У меня есть один сервер, который позволяет мне вставлять некоторые значения, не задавая другие, например, так: INSERT INTO table SET value_a='a', value_b='b'; (value_c - это поле, для которого не установлено значение по умолчанию, но здесь оно работает нормально). Когда сценарий перемещается на новый сервер, некоторые запросы INSERT прерываются, потому что он требует, чтобы в запросе были указаны все значения, отличные от значений по умолчанию, что выдает следующую ошибку при первом не указании значения, отличного от значения по умолчанию:

#1364 - Field 'value_c' doesn't have a default value

Установка значений по умолчанию для таблицы может нарушить функциональность в других областях, в противном случае я бы просто сделал это. Я хотел бы знать, что именно здесь происходит.

Ответы [ 2 ]

15 голосов
/ 01 июня 2011

Один из ваших серверов по умолчанию работает в строгом режиме, а другой - нет. Если сервер работает в строгом режиме (или вы установили его в своем соединении), и вы пытаетесь вставить значение NULL в столбец, определенный как NOT NULL, вы получите ошибку # 1364. Без строгого режима ваше значение NULL будет заменено пустой строкой или 0.

Пример:

CREATE TABLE `test_tbl` (
 `id` int(11) NOT NULL,
 `someint` int(11) NOT NULL,
 `sometext` varchar(255) NOT NULL,
 `somedate` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

SET sql_mode = '';
INSERT INTO test_tbl(id) VALUES(1);
SELECT * FROM test_tbl;
+----+---------+----------+---------------------+
| id | someint | sometext | somedate            |
+----+---------+----------+---------------------+
|  1 |       0 |          | 0000-00-00 00:00:00 |
+----+---------+----------+---------------------+
SET sql_mode = 'STRICT_ALL_TABLES';
INSERT INTO test_tbl(id) VALUES(2);
#1364 - Field 'someint' doesn't have a default value 
1 голос
/ 01 июня 2011
INSERT INTO table SET value_a='a', value_b='b'

выполнит следующий запрос:

к следующей таблице

TABLE `table`
    a varchar
    b varchar
    c varchar NOT NULL -- column is listed as NOT NULL !

И вы выполните к ней следующий запрос

INSERT INTO `table` (a,b,c) VALUES ('a', 'b', null)

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

Но почему я получаю эту ошибку на сервере B, а не на сервере A

Возможные причины:

  1. Операторы создания таблицыне одинаковы: сделайте show create table table1 на каждом сервере и тщательно сравните результаты.
  2. Триггер before insert присутствует на сервере A, но не на сервере B (или наоборот), который изменяет вводимые данные.выполните show triggers in databasex на каждом сервере и сравните вывод.
  3. В таблице на сервере A используется механизм, отличающийся от сервера B. Это будет показано в выводе show create table в качестве последней строки, например ENGINE=MyISAM

См .: http://dev.mysql.com/doc/refman/5.0/en/show-triggers.html
http://dev.mysql.com/doc/refman/5.0/en/show-create-table.html

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