2014-02-20 3 views
14

MySQL 5.5 & 5.6의 기본값 동작에 대한 설명이 필요합니다.MySQL 5.5 및 5.6 기본값

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

나는 문제없이 다음 쿼리를 실행 할 수 있어요 : 우리는 MySQL을 5.5 서버에 다음과 같은 테이블이 있다고 가정하자

다음 행 생성
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.6에서 5.5에서 나타난 동작을 복제하는 방법입니다.

중요하지만 5.6 서버의 경우 explicit_defaults_for_timestamp가 ON으로 설정되어 있는지 확실하지 않습니다.

이상적으로 나는이 문제에 대한 해결책이지만 누군가가 더 잘 이해할 수 있고 그것을 설명하면 유용 할 수도 있습니다.

감사합니다.

편집 : 우리는

+1

첫 번째 인서트가 처음에는 작동하지 않아야합니다. NULL 값을 null이 아닌 열에 넣으려고 * 데이터베이스에 요청 했으므로 5.6이 그것을 거부하는 것이 옳습니다. –

+0

이것은 5.6 – bear

+0

에서 작동합니다. @a_horse_with_no_name 열의 정의는 null이 될 수 없지만, 기본값이 제공되면 기본값을 사용합니다. 편집, 긁으십시오 – 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로 업데이트 할 때 나는 우리의 DB로했다 동일한 문제였다 작동합니다.

+0

이것이 작동하는 이유는 조금 복잡합니다. 당신이 정말로 할 수 없었을 때 컬럼을 NULL로 설정할 수있게 해주는 버그로 인해 쿼리가 5.5에서 작동했습니다. 5.6이 출시되었을 때, 그들은'explicit_defaults_for_timestamp' 플래그를 사용하여 비추천 기능이 잠시 동안 작동하도록했습니다. 그러나, 5.6.11에서, 그들은 당신과 (내) 쿼리가 의존했던 버그를 수정했습니다. 다행히도 여러분과 나는 깃발을 꺼 놓은 새로운 기본 행동이 우리가 원했던 행동과 정확히 일치합니다. – Boerema

+0

+1 차단제가 고정되었습니다. 감사합니다! – Gray

0

당신이 열을 생략 시도해 봤어의 MySQL 5.6.13을 사용하고 있습니까?

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

하이 로브를 실행할 수 있습니다에 explicit_defaults_for_timestamp을 설정, 모든 5.6 – BombTodley

+0

그리고 실제로 null 대신 동적 타임 스탬프 기본값이 생깁니 까? 흠. 가능한지 확실하지 않습니다. "explicit_defaults_for_timestamp를 OFF로 설정"했습니까? –

+0

그것은 했어 - 내가 위에서 말한 나의 의견에서 말했듯이 여전히 나에게 의미가 없지만 작동한다! – BombTodley