다음 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”를 제거하는 것입니다.
범위에는 관련이 있음을 명심하십시오.
세션에서만 영향을 미치려면을 사용하십시오 "@@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