오류 1067 (42000) : 'created_at'에 대한 잘못된 기본값


103

테이블을 변경하려고 할 때 오류가 표시되었습니다.

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

나는이 오류를 검색했지만 내가 찾은 것은 마치 타임 스탬프를 변경하려고 시도한 것 같아서 발생했습니다. 그러나 여기에 새 열을 추가하려고하는데이 오류가 발생합니다.

mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for 'created_at'

내 테이블의 마지막 두 열은 created_atupdated_at입니다.

내 테이블 구조는 다음과 같습니다.

여기에 이미지 설명 입력


이 열의 기본값은 무엇입니까? 테이블 구조를 공유해 주시겠습니까?
Priyanshu 2016-04-27

난 내 테이블 구조를 업데이트 한 @Priyanshu
iamsujit

2
마지막 두 열에 기본값 current_timestamp를 설정합니다.
Priyanshu

답변:


146

문제는 sql_modes 때문입니다 . 다음 명령으로 현재 sql_modes를 확인하십시오.

show variables like 'sql_mode' ; 

그리고 작동하도록 sql_mode " NO_ZERO_IN_DATE, NO_ZERO_DATE "를 제거하십시오 . 이것은 mysql 새 버전의 기본 sql_mode입니다.

다음 명령을 사용하여 sql_mode를 루트로 전역 적으로 설정할 수 있습니다.

set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

7
나는 이것을 알고 있지만 내 서버 sql_mode에서 공백으로 표시되고 여전히 작동하지 않습니다. [서버 버전 : 5.5.53-0ubuntu0.12.04.1-(Ubuntu)]를 사용하고 있습니다. 누구나 서버 버전을 업그레이드하지 않고도 어떤 솔루션을 가질 수 있습니까?
Priyabrata Atha

전역 명령으로 확인 했습니까? 동일한 세션에 대해 sql_mode에 아무것도 없습니까?
Aman Aggarwal

'sql_mode'와 같은 변수 표시를 확인했습니다. 출력은 Variable_name | Value = sql_mode |
Priyabrata Atha

2
이것은이 응답에 도움이 될 것입니다 stackoverflow.com/questions/2317650/...
Preshan Pradeepa

4
5.7에서 나를 위해 작동하지 않았습니다. 전 세계적으로해야하는지 확실하지 않습니다.
Brett

97

간단히 말해서 명령문을 실행하기 전에 다음을 첫 번째 줄에 넣으십시오.

SET sql_mode = '';

그것은 단지 굉장했습니다. 고마워 친구!
Novasol 2018

7
팁 고마워. 하지만 날짜 제한을 제거하는 것은 NO_ZERO_IN_DATE,NO_ZERO_DATE단지 우리가 다른 보안 기능을 유지할 수 있습니다 :SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
KeitelDOG

1
명확하게하기 위해이 설명은 프로덕션이 아닌 개발에만 사용해야합니다.
Ahmed Mohamed

간단하고 간단합니다.
Frank Fotangs

28

타사 데이터베이스를 설치하는 동안 동일한 오류가 발생했습니다. 제안 된 솔루션을 시도했지만 실패했습니다.
SET sql_mode = '';

그런 다음 데이터베이스를 설치할 수 있도록 작동하는 아래 명령을 시도했습니다.
SET GLOBAL sql_mode = '';


1
SET sql_mode = '';지금은 사용되지 않으며, SET GLOBAL sql_mode = ''OK입니다
바딤 아니시 모브

26

다음 명령을 시도하고 실행하십시오.

ALTER TABLE `investments` 
MODIFY created_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

ALTER TABLE `investments` 
MODIFY updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

이 오류가 발생하는 이유는 created_at및에 대한 기본값을 설정하지 않았기 때문입니다.updated_at 필드에 입니다. 이 열의 값은 null 일 수 없으므로 MySQL은 명령을 수락하지 않습니다.

도움이 되었기를 바랍니다.


2
덕분에 upvoted, 내 사용 사례에이 솔루션을 선호
ChrisR

5

제 경우에는 가져올 파일이 있습니다. 그래서 간단히 SET sql_mode = ''; 파일의 시작 부분에서 작동합니다!


5

다음 쿼리를 실행합니다.

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

그것은 나를 위해 작동합니다


그건 그렇고 SET time_zone = "+00 : 00"이 필요하지 않습니다;
Safak Ciplak

3

다음과 같이 할 수 있습니다.

 CREATE TABLE `ttt` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `t1` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t2` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t3` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t4` TIMESTAMP  NULL DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
  • TIMESTAMP 값은 Epoch Seconds로 저장되므로 두 번째 # 0이 '0000-00-00 00:00:00을 나타내는 데 사용되므로 타임 스탬프 값'1970-01-01 00:00:00 '(UTC)이 예약됩니다. '.
  • MariaDB 5.5 이전에는 CURRENT_TIMESTAMP가 기본값으로 정의 된 테이블 당 하나의 TIMESTAMP 열만있을 수있었습니다. 이 제한은 MariaDB 10.0 이후로 더 이상 적용되지 않습니다.

참조 : https://mariadb.com/kb/en/mariadb/timestamp/

견본

MariaDB []> insert into ttt (id) VALUES (1),(2),(3);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB []> select * from ttt;
+----+---------------------+---------------------+---------------------+---------------------+
| id | t1                  | t2                  | t3                  | t4                  |
+----+---------------------+---------------------+---------------------+---------------------+
|  1 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
|  2 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
|  3 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----+---------------------+---------------------+---------------------+---------------------+
3 rows in set (0.00 sec)

MariaDB []>

3

비슷한 문제가있었습니다. 다음은 해결되었습니다.

변화:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

에:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

즉, CURRENT_TIMESTAMP 주위의 따옴표를 제거하십시오 .

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


3

@Bernd Buffen의 답변에서 언급했듯이. 이것은 MariaDB 5.5의 문제이며, MariaDB 5.5를 MariaDB 10.1로 간단히 업그레이드하고 문제가 해결되었습니다.

CentOS 7 (64 비트) 에서 MariaDB 5.5를 MariaDB 10.1로 업그레이드하는 단계

  1. MariaDB repo에 다음 줄을 추가합니다.

    nano /etc/yum.repos.d/mariadb.repo 다음 줄을 붙여 넣습니다.

[mariadb]
NAME = MariaDB
base을 = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1

  1. 이미 실행중인 경우 MariaDB 중지 service mariadb stop
  2. 업데이트 수행

    yum update

  3. MariaDB 시작 및 업그레이드 수행

    service mariadb start

    mysql_upgrade

모든 것이 완료되었습니다.

MariaDB 버전 확인 : mysql -V


참고 : 업그레이드를 수행하기 전에 항상 데이터베이스를 백업하십시오. 업그레이드에 실패하거나 문제가 발생하면 데이터가 손실 될 수 있습니다.




2

Mysql5.7의 경우 mysql 명령 줄에 로그인하고 다음 명령을 실행합니다.

mysql> show variables like 'sql_mode' ;

sql_mode에서 NO_ZERO_IN_DATE, NO_ZERO_DATE가 표시됩니다.

여기에 이미지 설명 입력

mysql conf 파일에서 [mysqld] 아래에 줄을 추가하여 두 옵션을 제거하십시오. mine (Ubuntu 16의 mysql 5.7)은 /etc/mysql/mysql.conf.d/mysqld.cnf입니다.

여기에 이미지 설명 입력

이제 mysql을 다시 시작하십시오. 효과가있다!


0

Mysql8.0.18의 경우 :

CURRENT_TIMESTAMP([fsp])

"([fsp])"를 제거하고 문제를 해결했습니다.


0
  1. 먼저 기존 모드가 터미널에서 다음 명령을 사용하고 있는지 확인하십시오.

    $ mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"

    또는

    mysql> show variables like 'sql_mode';

    아래와 같은 출력이 표시됩니다.

    여기에 이미지 설명 입력

  2. my.cnf를 통한 모드 비활성화 :이 경우 NO_ZERO_IN_DATE, NO_ZERO_DATE 모드를 제거해야합니다.

    my.cnf 파일 열기 (일반적으로 /etc/my.cnf 또는 /etc/mysql/my.cnf에있는 my.cnf 파일을 찾을 수 있음)

    [mysqld]제목 아래 my.cnf의 업데이트 모드

    sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    여기서는 NO_ZERO_IN_DATE, NO_ZERO_DATE 모드를 생략했습니다.

  3. mysql 서버 다시 시작

    $ /etc/init.d/mysql restart

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