2014-02-20 7 views
14

Я хотел бы получить разъяснения о поведении значений по умолчанию в MySQL 5.5 & 5.6. Допустим, мы имеем следующую таблицу на MySQL 5.5 сервера:MySQL 5.5 и 5.6 значения по умолчанию

CREATE TABLE `test` (
`TestColumn` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
) ENGINE=INNODB DEFAULT CHARSET=utf8; 

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

INSERT INTO `test` VALUES (NULL); 

который создает следующую строку:

TestColumn 
2014-02-20 14:55:05 

Теперь, если я повторяю тот же тест на сервере MySQL 5.6, сбой вставки:

Error Code: 1048 
Column 'TestColumn' cannot be null 

Я понимаю, что автоматическая инициализация временной метки изменилась в 5.6 (http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html), но то, что я не могу сработать, - это как воспроизвести поведение, наблюдаемое в 5.5 в 5.6.

Не уверен, имеет ли значение, но наш сервер 5.6 имеет значение explicit_defaults_for_timestamp, установленное в положение ON.

В идеале, то, что мне нужно, является решением этого, но если кто-то лучше понимает и может объяснить это, что было бы полезно также.

Спасибо.

EDIT: Мы используем MySQL 5.6.13

+1

первая вставка не должна была работать в первую очередь. Вы * запросили * базу данных, чтобы поместить значение NULL в столбец не-нуль, так что 5.6 правильно отклоняет это. –

+0

Это работает с 5.6 – bear

+0

@a_horse_with_no_name. Определение состоит в том, что столбец не может быть нулевым, однако если задан по умолчанию, он будет использовать значение по умолчанию. Изменить, поцарапать, что – bear

ответ

12

Поведение, показанное выше в 5.5, было на самом деле ошибкой. Это было зафиксировано в 5.6.11. Проверьте release notes for 5.6.11 на самом дне. Это было частью ошибок 68472 и 16394472 (на которые я не могу найти ссылку).

Если включить explicit_defaults_for_timestamp флаг выключен, он должен работать, как это было в 5,5

Это был тот же самый вопрос, который я имел с нашей БД, когда мы обновили от 5,5 до 5,6.

+0

Причина, по которой это работает, немного сложна. Ваш запрос работал в версии 5.5 из-за ошибки, которая позволяла вам установить столбец в NULL, когда вам действительно не удалось. Когда было выпущено 5.6, они сделали флаг 'explicit_defaults_for_timestamp', чтобы позволить устаревшим функциям работать в промежуточный период. Однако в 5.6.11 они исправили ошибку, на которую полагался ваш (и мой) запрос. К счастью для вас и меня, NEW поведение по умолчанию с выключенным флагом - это именно то, что мы хотели. – Boerema

+0

+1 Только что зафиксировал блокировщик для нас. Большое спасибо! – Gray

0

Пробовали ли вы опуская колонку?

INSERT INTO `test`() VALUES(); 
+0

Привет, Rob, это сработало бы для моего пример, но в производстве мы используем Hibernate как наш ORM, поэтому хотим иметь возможность устанавливать NULL против столбца во многих случаях, спасибо в любом случае. – BombTodley

+0

и привести к тому, что значение динамической метки времени будет использоваться вместо фактического нуля? гектометр не уверен, что это возможно. сделал «установка explicit_defaults_for_timestamp в OFF», чтобы это произошло? –

+0

Это было да, как я сказал в своем комментарии выше, это все еще не имеет смысла для меня, но это работает! – BombTodley

Смежные вопросы