[mysql] ‘create_date’시간 소인 필드의 유효하지 않은 기본값

다음 sql create 문이 있습니다.

mysql> CREATE  TABLE IF NOT EXISTS `erp`.`je_menus` (
    ->   `id` INT(11) NOT NULL AUTO_INCREMENT ,
    ->   `name` VARCHAR(100) NOT NULL ,
    ->   `description` VARCHAR(255) NOT NULL ,
    ->   `live_start_date` DATETIME NULL DEFAULT NULL ,
    ->   `live_end_date` DATETIME NULL DEFAULT NULL , 
    ->   `notes` VARCHAR(255) NULL ,
    ->   `create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
    ->   `created_by` INT(11) NOT NULL ,
    ->   `update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,
    ->   `updated_by` INT(11) NOT NULL , 
    ->   `status` VARCHAR(45) NOT NULL ,
    ->   PRIMARY KEY (`id`) ) 
    -> ENGINE = InnoDB;

다음과 같은 오류를주는

ERROR 1067 (42000): Invalid default value for 'create_date'

여기에 오류가 무엇입니까?



답변

서버 SQL 모드 -NO_ZERO_DATE 때문입니다 .

참조에서 : NO_ZERO_DATE-엄격 모드에서 '0000-00-00'유효한 날짜로 허용하지 마십시오 . IGNORE 옵션을 사용하여 날짜를 0으로 삽입 할 수 있습니다 . 엄격 모드가 아닌 경우 날짜가 적용되지만 경고가 생성됩니다.


답변

MySQL 워크 벤치에서 스크립트를 생성 한 경우

다음 줄이 생성됩니다

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

SQL_MODE에서 TRADITIONAL을 제거하면 스크립트가 정상적으로 작동합니다.

그렇지 않으면 SQL_MODE를 유효하지 않은 날짜 허용으로 설정할 수 있습니다

SET SQL_MODE='ALLOW_INVALID_DATES';


답변

TIMESTAMP의 범위는 ‘1970-01-01 00:00:01’UTC에서 ‘2038-01-19 03:14:07’UTC입니다 ( doc 참조 ). 기본값은 해당 범위 내에 있어야합니다.

다른 이상한 관련 행동 :

CREATE TABLE tbl1 (
    ts TIMESTAMP);
Query OK, 0 rows affected (0.01 sec)

CREATE TABLE tbl2 (
    ts TIMESTAMP,
    ts2 TIMESTAMP);
ERROR 1067 (42000): Invalid default value for 'ts2'

CREATE TABLE tbl3 (
    ts TIMESTAMP,
    ts2 TIMESTAMP DEFAULT '1970-01-01 00:00:01');
Query OK, 0 rows affected (0.01 sec)

NULL을 삽입하려는 경우 참고 사항 :

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);


답변

우분투 데스크톱 16.04에서 다음과 같이했습니다.

  1. 파일 열기 : /etc/mysql/mysql.conf.d/mysqld.cnf선택한 편집기에서.

  2. 를 찾으십시오 : sql_mode, 아래 어딘가에있을 것 [mysqld]입니다.

  3. sql_mode다음으로 설정 하십시오.

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. 다음을 수행하여 mysql 서비스를 저장 한 후 다시 시작하십시오.

    sudo service mysql restart


답변

OS X를 사용하여 컴파일 된 기본값을 기반으로 시스템 변수 인 Homebrew의 mysql을 설치 하십시오. 해결책은 시스템 변수 “sql_mode”에서 “NO_ZERO_DATE”를 제거하는 것입니다.

범위에는 관련이 있음을 명심하십시오.

세션에서만 영향을 미치려면을 사용하십시오 "@@session". 예를 들면 다음과 같습니다.

SET @@session.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

이 경우 세션이 종료되거나 변경되면 영향을 미치지 않습니다. 다른 세션에는 영향을 미치지 않습니다.

모든 클라이언트에 영향을 미치려면 "@@global"예를 들어을 사용하십시오 .

SET @@global.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

이 경우 변경 후 연결 한 클라이언트에만 영향을 미치며 (현재 모든 클라이언트에는 영향을 미치지 않음) 일단 서버가 종료되면 작동하지 않습니다.


답변

Homebrew에서 MySQL을 설치하여 OS X에서이 문제를 해결할 수있었습니다

brew install mysql

/usr/local/etc/my.cnf에 다음을 추가하여

sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

MySQL 재시작

brew tap homebrew/services
brew services restart mysql


답변

다음 코드로 MySQL 5.7과 비슷한 문제가 발생했습니다.

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

대신 이것을 사용하여 수정했습니다.

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP