[SQL] MySQL의 오류 때 DATE 또는 DATETIME에 대한 기본 값을 설정
SQLMySQL의 오류 때 DATE 또는 DATETIME에 대한 기본 값을 설정
나는 MySQL 서버 5.7.11이 문장을 실행 해요 :
updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
작동하지 않는다. 오류주기 :
ERROR 1067 (42000): Invalid default value for 'updated'
그러나 다음과 같은 :
updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
바로 작동합니다.
DATE의 같은 경우.
(!) 참고로, 그것은 MySQL의 문서에 언급되어있다 :
그들은 또한 뭐니해도 :
그것은 그 오류를주는 이유 계정으로도 MySQL의 문서에서 두 번째 견적을 갖는, 사람이 알려주 수 있을까?
해결법
-
==============================
1.오류 때문에 최신 MYSQL 5.7 문서에 따라 엄격 모드 될 수있는 SQL 모드입니다
오류 때문에 최신 MYSQL 5.7 문서에 따라 엄격 모드 될 수있는 SQL 모드입니다
MySQL의 문서 5.7는 말한다 :
MYSQL 모드를 확인하려면
SELECT @@ GLOBAL.sql_mode 글로벌 @@ SESSION.sql_mode 세션
비활성화 STRICT_TRANS_TABLES 모드
그러나 형식을 0000-00-00 00 수 있도록 : 00 :시 취침 MySQL의 설정 파일에서 또는 명령에 의해 비활성화 STRICT_TRANS_TABLES 모드로이
명령
SET sql_mode = '';
또는
SET GLOBAL의 sql_mode = '';
키워드를 사용하여 글로벌 슈퍼 권한이 필요하며 모든 클라이언트에 그 시간에서 연결 작업에 영향을 미치는
STRICT_TRANS_TABLES에서 (우분투에 따라) /etc/mysql/my.cnf에 이동보다 작업 및 주석하지 않습니다 위의 경우
영구적 서버 시작시 SQL 모드를 설정하려는 경우 또한, 다음 리눅스 나 맥 OS에 my.cnf 파일에 SET의 sql_mode을 = ''등이 있습니다. 창문이있는 my.ini 파일에서 수행되어야한다.
노트
그러나 엄격 모드는 MYSQL 5.6에서 기본적으로 사용할 수 없습니다. 따라서 그것은 말한다 MYSQL 6 문서에 따라 오류를 생성하지 않습니다
최신 정보
딜런 - 스와 @ 말했다로 버그 문제에 대해서 :
나는이는 방식 MYSQL은 몇 가지가 제품의 추가 개선에 따라 변경으로 인한되는 시간에 걸쳐 진화하는 버그라고 생각하지 않습니다.
그러나 나는 지금에 대한 또 다른 관련 버그 리포트를 () 함수
날짜 시간 필드) (기본적를 허용하지 않습니다
또 다른 유용한 참고 [TIMESTAMP와 DATETIME에 대한 자동 초기화 및 업데이트를 참조]
업데이트에 관한 NO_ZERO_DATE
MySQL의 현재 5.7.4의이 모드는 사용되지 않습니다. 이전 버전 사용자는 설정 파일의 각 행을 주석 처리해야합니다. NO_ZERO_DATE에서 MySQL 5.7 문서를 참조하십시오
-
==============================
2.나는 MySQL은 5.7.14와 WAMP 3.0.6이 오류가 있었다.
나는 MySQL은 5.7.14와 WAMP 3.0.6이 오류가 있었다.
해결책:
변화 라인 70 ℃에서 (당신의 INI 파일이 훼손되지 않은 경우) : \ WAMP \ 빈 \ mysql을 \ mysql5.7.14 \의 my.ini 파일에서
sql-mode= "STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
에
sql-mode="ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
모든 서비스를 다시 시작합니다.
이것은 엄격 모드를 비활성화합니다. 문서에 따라, "엄격 모드"를 사용할 수 STRICT_TRANS_TABLES 또는 STRICT_ALL_TABLES 중 하나 또는 둘 모두와 모드를 의미한다. 문서는 말합니다 :
-
==============================
3.나는 데이터가 날짜 필드에 NULL과 0000-00-00 사이의 혼합 상황에있어. 하지만, 때문에 NULL로 '0000-00-00'를 업데이트하는 방법을 알고하지 않았다
나는 데이터가 날짜 필드에 NULL과 0000-00-00 사이의 혼합 상황에있어. 하지만, 때문에 NULL로 '0000-00-00'를 업데이트하는 방법을 알고하지 않았다
update my_table set my_date_field=NULL where my_date_field='0000-00-00'
더 이상 허용되지 않습니다. 내 해결 방법은 아주 간단했다 :
update my_table set my_date_field=NULL where my_date_field<'1000-01-01'
모든 잘못된 my_date_field 값 (정확한 날짜 여부)이 날짜 이전부터 있었기 때문에.
-
==============================
4.MYSQL의 일부 버전에서 (5.7 테스트. *) * 괜찬아 체제에서이 구문을 사용한다 :
MYSQL의 일부 버전에서 (5.7 테스트. *) * 괜찬아 체제에서이 구문을 사용한다 :
[mysqld] sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION"
따옴표를 대시 없다
sql-mode=NO_ENGINE_SUBSTITUTION
따옴표 밑줄
sql_mode=NO_ENGINE_SUBSTITUTION
밑줄 따옴표
sql_mode="NO_ENGINE_SUBSTITUTION"
설정 값과 SQL 모드의 더 완전한 검토 :
어떻게 설정 영구적는 SQL 모드 플래그에
-
==============================
5.먼저 현재 세션 sql_mode를 선택 :
먼저 현재 세션 sql_mode를 선택 :
SELECT @@SESSION.sql_mode;
그럼 당신은 그 디폴트 값 같은 것을 얻을 것이다 :
다음 'NO_ZERO_DATE'없이 sql_mode을 설정합니다 :
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을 위해 또한 그것을 할 수 있습니다 :
SELECT @@GLOBAL.sql_mode; SET GLOBAL sql_mode = '...';
-
==============================
6.그냥 줄을 추가 : sql_mode = "NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
그냥 줄을 추가 : sql_mode = "NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
내부 파일 : /etc/mysql/mysql.conf.d/mysqld.cnf
다음 서비스 mysql을 다시 시작 SUDO
-
==============================
7.그것은 5.7.8 작동 :
그것은 5.7.8 작동 :
mysql> create table t1(updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'); Query OK, 0 rows affected (0.01 sec) mysql> show create table t1; +-------+-------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-------------------------------------------------------------------------------------------------------------------------+ | t1 | CREATE TABLE `t1` ( `updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 | +-------+-------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select version(); +-----------+ | version() | +-----------+ | 5.7.8-rc | +-----------+ 1 row in set (0.00 sec)
당신은 당신의 문제를 재현하는 SQLFiddle을 만들 수 있습니다.
http://sqlfiddle.com/
그것은 MySQL을 5.6과 5.7.8을 위해 작동하지만, 5.7.11에 실패합니다. 그 다음은 아마 5.7.11에 대한 회귀 버그.
-
==============================
8.(서버 측의 용액을 도포 한 후) MySQL 워크 벤치의 문제점을 해결하려면
(서버 측의 용액을 도포 한 후) MySQL 워크 벤치의 문제점을 해결하려면
환경 설정 패널에서 전통에 SQL_MODE를 제거합니다.
-
==============================
9.이 답변 그냥 MySQL을 5.7을위한이다 :
이 답변 그냥 MySQL을 5.7을위한이다 :
베스트 정말 대신 PHP 세션 변수에 사용, 빈 sql_mode에 설정되지 않은 :
SET SESSION sql_mode= 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
그래서 적어도 당신은 다른 기본값을 유지합니다.
그것은 MySQL의 문서가 명확하지 않은 경우, 당신은 sql_mode이 기본 값을 삭제 필요 미친 :
NO_ZERO_IN_DATE, NO_ZERO_DATE, 나는 이해하지만 미래의 versiones이 중단됩니다.
매개 변수가 무시되기 전에 STRICT_ALL_TABLES이와 함께, 그래서 당신은 너무 삭제할 필요가있다.
마지막으로 전통도이 매개 변수에 대한 문서가 말하는 그러나이 매개 변수를 사용하여, 열 "에 잘못된 값을 삽입 할 때"대신 경고의 오류를 줄 ", 0 값과 날짜는하지만 네없이 삽입되지 않았습니다.
MySQL은 정말 이러한 매개 변수와 조합으로 조직되지 않습니다.
-
==============================
10.MySQL의 버전 14.14 DISTRIB 5.7.18, Linux 용 (x86_64에)에 대한 옵션 조합.
MySQL의 버전 14.14 DISTRIB 5.7.18, Linux 용 (x86_64에)에 대한 옵션 조합.
포기하지 않는다 :
STRICT_TRANS_TABLES + NO_ZERO_DATE
예외 :
STRICT_TRANS_TABLES + NO_ZERO_IN_DATE
우분투에 /etc/mysql/my.cnf에서 내 설정 :
[mysqld] sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
-
==============================
11.
set global sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
from https://stackoverflow.com/questions/36374335/error-in-mysql-when-setting-default-value-for-date-or-datetime by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MYSQL 업데이트 문 내부는 테이블을 조인 (0) | 2020.03.25 |
---|---|
[SQL] 관계형 데이터베이스에서 키 값 쌍 (0) | 2020.03.25 |
[SQL] SELECT 문에서 NOLOCK 힌트의 효과 (0) | 2020.03.25 |
[SQL] SQL : WHERE 절 내에서 IF 절 (0) | 2020.03.25 |
[SQL] 여러 테이블에서 COUNT (*)를 선택 (0) | 2020.03.25 |