'create_date'시간 소인 필드의 유효하지 않은 기본값


186

다음 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'

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


귀하의 검색어에 문제가 없으며 방금 테스트 한 5.1.50-community에서 작동합니다.
Jaspreet Chahal

내 말도 괜찮습니다.
Shakti Singh

확실하지는 않지만 해당 필드에 다른 이름을 지정하고 시도해보십시오.
Naveen Kumar 2012

우분투 10.04에서 mysql 5.1.56 커뮤니티를 사용합니다. 작동하지 않음
robert

5
0이 아닌 날짜에는 날짜가 필요합니다. '1970-01-01 00:00:01'을 사용하십시오. [여기에서 찍은] [1] [1] : dba.stackexchange.com/questions/6171/…
Jadeye

답변:


176

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

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


19
무시 옵션을 어떻게 부여합니까?
robert

9
이 옵션은 무시할 수 없습니다. 서버 옵션입니다. my.ini (mysql 구성 파일)에 액세스 할 수 있으면 sql-mode 옵션에서 NO_ZERO_DATE를 제거하고 서버를 다시 시작하십시오.
Devart

7
이 옵션을 선택하려면 - 실행 SHOW의 VARIABLES LIKE 'sql_mode'
Devart

6
mysql workbench를 사용하여 스크립트를 생성했습니다. 스크립트에서 sql_mode는 traditional으로 설정됩니다. 전통적인 것을 제거하면 스크립트가 작동합니다.
robert

17
MySQL Workbench 환경 설정에서 '모델 : MySQL'탭으로 이동하십시오. '생성 된 스크립트에 사용될 SQL_MODE'를 "STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"으로 설정하여 문제를 해결했습니다.
sgtdck

140

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

다음 줄이 생성됩니다

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

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

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

SET SQL_MODE='ALLOW_INVALID_DATES';

1
도대체 왜 작동하지 않는지 검색하는 데 시간이 절약되었습니다. :)
Srneczek

5
아 감사합니다. SET SQL_MODE = 'ALLOW_INVALID_DATES'; 생명의 은인이었습니다. WordPress 사이트를 다른 서버 (로컬 모두)로 마이그레이션하려고 할 때이 문제가 발생 했으며이 오류가있는 테이블에 행이 없어도이 오류로 인해 데이터베이스 데이터를 가져올 수 없습니다.
mikato

매력처럼 일했다! 감사합니다.
moreirapontocom

52

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);

1
이것은 나에게 일어나고 있습니다. 무슨 일이야? ts2도 "NOT NULL"이 아닙니다 ...!
PedroD

2
"테이블의 첫 번째 TIMESTAMP 열에 값을 설정하지 않으면 MariaDB는 해당 행에서 UPDATE 또는 INSERT 쿼리를 수행 할 때 현재 날짜와 시간을 자동으로 할당합니다." – MariaDB Docs
jsphpl

1
의 사용을 좋아합니다 column_name TIMESTAMP DEFAULT NOW(). 모든 상황에 적합하지는 않지만 이것을 다루고 나서 공유하고 싶다고 생각했습니다.
DeezCashews

1
column_name TIMESTAMP DEFAULT '1970-01-01 00:00:01'은 나를 위해 속임수를 썼습니다. 감사!
metafa

42

우분투 데스크톱 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


8
sql_mode우분투 16.04에 mySQL 인스턴스가 없다는 것을 제외하고는 도움 이되었습니다. "NO_ZERO_DATE"를 제거하여 파일에 항목을 추가해야했습니다. 그래서, 여기가 지금 모습입니다 : 라인 아래를 #Adding NO_ZERO_DATE 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 없애
OK999

strict 모드를 비활성화하기 위해 이전에 추가했습니다.이 특정 문제에 대해 편집 할 때 sql_mode항목이 이미있었습니다.
Mubashar Abbas

이것이 버그입니까? CURRENT_TIMESTAMP는 "0000-00-00 00:00:00"을 반환하지 않아야합니다. 그렇지 않습니까? mysqld 설정을 변경해야하는 이유는 무엇입니까?
letsjump

누군가 mysql 서버를 잘못 구성했기 때문에 @letsjump. 가져온 데이터베이스 에서이 문제가 발생했습니다. 열의 타임 스탬프 기본값은 유효한 타임 스탬프 값이 아닙니다. REAL 수정은 기본 타임 스탬프를 1970 년과 같은 유효한 날짜로 업데이트하는 것입니다. 임시 해결 방법은 데이터베이스 확인을 비활성화하는 것입니다.
anon58192932

9

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".

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


8

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

7

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

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

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

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP


2
필자는 이것이 기본값으로 전류를 기본값으로하는 것이 가장 좋은 방법이라고 생각하지만 출생 타임 스탬프에는 적합하지 않습니다.
meow

7

이 문제를 피하려면 NO_ZERO_DATEmysql 모드 구성에서 제거해야 합니다.

  1. 'phpmyadmin'으로 이동하십시오.
  2. phpmyadmin이로드되면 '변수'탭을 클릭하십시오.
  3. 'sql 모드'를 검색하십시오.
  4. 편집 옵션을 클릭 NO_ZERO_DATE하고 구성에서 후행 쉼표를 제거하십시오 .

이는 wamp 또는 xamp가있는 로컬 환경에서 매우 일반적인 문제입니다.


6

데이터베이스 SQL 파일 맨 위에 다음 행을 정의하십시오.

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

나를 위해 일하고 있습니다.


2

엄격한 SQL 모드를 비활성화하려면

Create disable_strict_mode.cnf file at /etc/mysql/conf.d/

파일에서 다음 두 줄을 입력하십시오.

[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

마지막으로 다음 명령으로 MySQL을 다시 시작하십시오.

sudo service mysql restart

1

MySql 인스턴스에서 시간대 설정을 검사 할 수 있습니다.

mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+

필자의 경우 기본 시스템의 시간대가 UTC가 아닌 BST로 설정되어 있음을 알았으므로 작성 테이블에서 기본값 '1970-01-01 00:00:01'이 1 시간 뒤로 밀려서 유효하지 않은 타임 스탬프 값

나에게 실제로 기계의 시간대를 UTC로 설정하고 싶었 기 때문에 나를 분류했습니다. Centos / 7을 실행하면서 간단히

# timedatectl set-timezone UTC

모든 것을 다시 시작했습니다.


1

기본값은 1000 년부터 시작해야합니다.

예를 들어

ALTER TABLE mytable last_active DATETIME DEFAULT '1000-01-01 00:00:00'

이것이 누군가를 돕기를 바랍니다.


1

이것을 변경하십시오 :

`create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,

다음과 같이 :

`create_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ,
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,

1
리뷰에서 : 안녕하세요, 소스 코드로 대답하지 마십시오. 솔루션 작동 방식에 대한 좋은 설명을 제공하십시오. 참조 : 좋은 답변을 작성하려면 어떻게합니까? . 감사합니다
sɐunıɔ ןɐ qɐp

이 사이트가 WordPress 사이트 인 경우 Core WordPress 테이블을 업데이트하지 마십시오. 많은 플러그인은 가치가 높기 때문에 워드 프레스는 플러그인을 손상시키는 레거시 이유로이 기본값을 변경할 수 없습니다. 워드 프레스 스레드워드 프레스 지원 . 기본값에 의존하는 코드에 익숙하지 않고 데이터베이스 구조를 변경하면 버그가 발생할 수 있습니다. 이것은 많은 경우에 해결책으로 작동 할 수 있지만 다른 곳에서는 문제를 일으킬 수 있습니다. 보편적 인 솔루션이 아닙니다.
SherylHohman

0

당신은 이것을 바꿀 수 있습니다 :

`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

이런 식으로 :

`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',

0

당신은 이것을 바꿀 수 있습니다 :

create_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',

이런 식으로 :

create_date varchar (80) NOT NULL DEFAULT '0000-00-00 00:00:00',

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.