Programing

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

crosscheck 2020. 5. 30. 09:21
반응형

'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"를 제거하는 것입니다.

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

If you want to affect only in your session, please use "@@session", For example:

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

In this case, it will not affect once your session ends or your change it. It has not effect on other session.

If you want to affect on all client, please use "@@global", for example:

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

In this case, it only affects on the clients that connect after the change(not affect on current all clients), and will not work once server exit.


I was able to resolve this issue on OS X by installing MySQL from Homebrew

brew install mysql

by adding the following to /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

and restarting MySQL

brew tap homebrew/services
brew services restart mysql

I had a similar issue with MySQL 5.7 with the following code:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

I fixed by using this instead:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP


To avoid this issue, you need to remove NO_ZERO_DATE from the mysql mode configuration.

  1. Go to 'phpmyadmin'.
  2. Once phpmyadmin is loaded up, click on the 'variables' tab.
  3. Search for 'sql mode'.
  4. Click on the Edit option and remove NO_ZERO_DATE (and its trailing comma) from the configuration.

This is a very common issue in the local environment with wamp or xamp.


Just Define following lines at top of your Database SQL file.

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

It is working for me.


You might like to examine the timezone setting on the MySql instance:

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

in my case, I realised that the underlying system had it's timezone set to BST rather than UTC, and so in the create table the default of '1970-01-01 00:00:01' was being coerced back 1 hour, resulting in an invalid timestamp value.

For me, I actually wanted the machine's timezone set to UTC, and that sorted me out. As I was running Centos/7, I simply did

# timedatectl set-timezone UTC

and restarted everything.


To disable strict SQL mode

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

In the file, enter these two lines:

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

Finally, restart MySQL with this command:

sudo service mysql restart

You could just change this:

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

To something like this:

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

Default values should start from the year 1000.

For example,

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

Hope this helps someone.

참고URL : https://stackoverflow.com/questions/9192027/invalid-default-value-for-create-date-timestamp-field

반응형