'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에서 다음과 같이했습니다.
파일 열기 :
/etc/mysql/mysql.conf.d/mysqld.cnf
선택한 편집기에서.를 찾으십시오 .
sql_mode
아래 위치에[mysqld]
있습니다.sql_mode
다음으로 설정 하십시오.NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
다음을 수행하여 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.
- Go to 'phpmyadmin'.
- Once phpmyadmin is loaded up, click on the 'variables' tab.
- Search for 'sql mode'.
- 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
'Programing' 카테고리의 다른 글
postgresql information_schema의 모든 테이블을 나열하십시오. (0) | 2020.05.30 |
---|---|
마지막 프레임에서 CSS3 애니메이션 중지 (0) | 2020.05.30 |
연관 배열에서 키와 그 값을 제거하려면 어떻게해야합니까? (0) | 2020.05.30 |
두 개의 맵을 병합하고 동일한 키의 값을 합하는 가장 좋은 방법은 무엇입니까? (0) | 2020.05.30 |
CSS를 사용하여 사용자 정의 글꼴을 사용하십니까? (0) | 2020.05.30 |