mysql 오류 1364 필드에 기본값이 없습니다.


113

내 테이블은

create table try ( name varchar(8), CREATED_BY varchar(40) not null);

그런 다음 CREATED_BY 필드를 자동으로 채우는 트리거가 있습니다.

create trigger autoPopulateAtInsert BEFORE INSERT on try for each row set new.CREATED_BY=user();

삽입을 할 때

insert into try (name) values ('abc');

항목이 테이블에 작성되었지만 여전히 오류 메시지가 나타납니다.

Field 'CREATED_BY' doesn't have a default value Error no 1364

필드를 nullable로 만들지 않고 triggfer를 제거하지 않고이 오류를 억제하는 방법이 있습니까? 그렇지 않으면 내 최대 절전 모드에서 이러한 예외가 표시되고 (삽입이 이루어 졌더라도) 응용 프로그램이 충돌합니다.

답변:


28

에 대한 기본값을 설정하면 Created_By(예 : empty VARCHAR) 트리거가 값을 업데이트합니다.

create table try ( 
     name varchar(8), 
     CREATED_BY varchar(40) DEFAULT '' not null
);

Java 프로그램에서 기본값을 설정하는 방법은 무엇입니까?
Nagarajan Shanmuganathan

1
테이블 정의에 기본값이 필요합니다 (create table try (name varchar (8), CREATED_BY varchar (40) DEFAULT ''not null))
KinSlayerUY

이것은 근본 문제를 해결하지 않습니다. 아래 Phyxx의 훨씬 더 광범위한 답변을 참조하십시오.
csvan

3
@csvan Phyxx의 대답은 근본 원인이 v5.7.1에서 수정되었습니다 MySQL의에서 문제 때문에 하나 근본 원인을 해결하지 않습니다 - B98에 의해 대답을 참조하십시오 stackoverflow.com/a/29854279/5389997를 strict_trans_table SQL 모드가 더 MySQL을하게 제거 데이터 품질 오류가 발생하기 쉬우므로 제거하는 것은 좋은 조언이 아닙니다.
Shadow

205

이것은에 STRICT_TRANS_TABLES정의 된 SQL 모드 로 인해 발생 합니다.

% PROGRAMDATA % \ MySQL \ MySQL Server 5.6 \ my.ini

파일. 해당 설정을 제거하고 MySQL을 다시 시작하면 문제가 해결됩니다.

보다 https://www.farbeyondcode.com/Solution-for-MariaDB-Field--xxx--doesn-t-have-a-default-value-5-2720.html를

해당 파일을 편집해도 문제가 해결되지 않으면 http://dev.mysql.com/doc/refman/5.6/en/option-files.html 에서 구성 파일의 다른 가능한 위치를 참조 하십시오 .


5
phpMyAdmin과 같은 데이터베이스 관리 도구 내에서 SQL 쿼리를 실행할 수 있습니다. -- verified that the mode was previously set select @@GLOBAL.sql_mode; -- UPDATE MODE SET @@global.sql_mode= 'YOUR_VALUE';
anasanjaria 2013

5
하지만 STRICT_TRANS_TABLES를 원하십니까?
Andrew

필자의 경우 필드는 기본값이 NULL로 설정된 DATETIME 유형이며 여전히 동일한 오류가 표시되며 동일한 데이터베이스에 두 개의 스키마가 있습니다. 하나는 스테이징 용이고 다른 하나는 프로덕션 용이며 동일한 테이블 구조를 사용합니다. 하나의 스키마에서 작동하지만 둘 다에서 정확히 동일한 테이블 구조로 다른 스키마에서는 작동하지 않습니다. 당황 스럽네요 .. STRICT_TRANS_TABLES 문제인지 잘 모르겠습니다
dresh

1
sql_mode로 시작하는 줄에서 /etc/my.cnf에서 STRICT_TRANS_TABLES를 제거하고 mysql 서비스를 다시 시작하고 문제가 사라졌습니다.
Mike Volmar 19-01-28

92

phpmyadmin을 열고 'More'탭으로 이동하여 'Variables'하위 메뉴를 선택합니다. 아래로 스크롤하여 SQL 모드를 찾습니다. SQL 모드를 편집하고 'STRICT_TRANS_TABLES'를 제거하십시오. 저장하십시오.


22
이 질문은 MySQL에 관한 것이며 phpmyadmin에 대해서는 언급하지 않습니다. 모든 사람이 그렇게 실행한다고 가정하지 마십시오.
Chris

2
@ jackadams49이 변경 사항은 유지되지 않습니다. 시스템 재부팅 후에도이 변경 사항을 적용하기 위해 수행 한 작업을 알려주시겠습니까?
LD James

8
@ jackadams49는, 머물 수 있도록하기 위해 sudo nano /etc/mysql/my.cnf, 추가 [mysqld] sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"저장 및 종료, 다시 시작 mysql을 sudo service mysql restart
maan81

1
추가하려면의 값 sql_mode을 null, 즉 sql_mode = ""다른 유사한 오류 로 변경해야했습니다 .
maan81

최근에 MySQL을 5.7로 업그레이드했습니다. 우리는 너무 많은 문제에 직면했습니다. 이것은 나를 위해 일했습니다. 내 하루를 구했습니다.
Pupil

38

phpmyadmin에서 다음을 수행하십시오.

select @@GLOBAL.sql_mode

제 경우에는 다음을 얻습니다.

ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES ,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

이 결과를 복사하고 STRICT_TRANS_TABLES. 그런 다음 다음을 수행하십시오.

set GLOBAL sql_mode='ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

하지만이를 위해서는 루트 계정으로 phpmyadmin에 로그인해야합니다. :) 슈퍼 계정
user889030

1
4 시간을 보낸 후이 솔루션은 Ubuntu 16.04에서 저에게 효과적이었습니다. 좋아요!
Waleed Ahmed

3
전혀 필요하지 않습니다 . 명령 줄 phpmyadmin에서이 명령을 사용하십시오 mysql.
gustyaquino

4
이것은 mysql / server / pc가 다시 시작된 후 기본값으로 재설정됩니다. 당신은 편집 /etc/mysql/mysql.conf.d/mysqld.cnf해야하고, [mysqld를] 후이 줄을 추가 : = 'ONLY_FULL_GROUP_BY, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_UBSTITUTION'sql_mode을
waza123

@ waza123의 솔루션, 이것은 mysql 5.7.20으로 업그레이드 한 후 나를 위해 작동합니다. 감사합니다
프레디 kardian

28

Homebrew와 함께 설치된 mysql5.6.20에서 이와 동일한 문제가 발생했을 때 my.cnf로 이동하여 문제를 해결했습니다.

nano /usr/local/Cellar/mysql/5.6.20_1/my.cnf

다음과 같은 줄을 찾으십시오.

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

줄 위에 주석을 달고 mysql 서버를 다시 시작하십시오.

mysql.server restart

오류가 사라졌습니다!


15

mysql 콘솔을 실행합니다.

mysql -u your_username -p

, 데이터베이스 선택 :

USE your_database;

(mysql 콘솔에서도) 실행하십시오.

SET GLOBAL sql_mode='';

그것은 엄격 모드를 끄고 mysql은 더 이상 불평하지 않을 것입니다.

명확하게하기 위해 데이터베이스 정의에 "이 필드에는 기본값이 정의되어 있어야합니다"라고 말하고 위에서 단계를 수행하여 MySql에 "그냥 무시하십시오"라고 말합니다. 따라서 로컬에서 빠른 수정을 원할 경우이 솔루션은 괜찮습니다. 그러나 일반적으로 데이터베이스 정의를 조사하고 필드에 실제로 기본값이 필요한지 확인하고 필요한 경우 설정해야합니다. 그리고 기본값이 필요하지 않은 경우이 요구 사항을 제거하여 상황을 정리해야합니다.


예, 기본값을 추가하지 말고 규칙을 제거하면됩니다. 훌륭한 솔루션 (풍자 암시)은 절대 나쁜 예가 아닙니다. 그래도 문제를 해결합니다.
zardilior

1
네, 동의합니다. 그러나 언젠가 다른 사람의 프로젝트가 있는데, 즉 프로덕션에서 (엄격 모드가 설정되지 않은 경우) 잘 실행되고 로컬에서 작동하는 작은 기능이나 버그 수정을 추가하려고합니다. 당신은 드래곤과 싸우고 싶지 않습니다. :)
MilanG

그 동의 시나리오
zardilior

@zardilior 문제가 무엇입니까? 규칙이 제거되면 열 유형에 따라 기본값이 선택됩니다. 나는 그것에 대해 잘못된 것이 없습니다. : / 그 규칙은 이유없이 매우 가혹합니다.
Reloecc

1
전혀 가혹하지 않고 기본값을 선언하거나 값을 제공하도록 강요하며 엄격 모드는 그보다 더 많은 일에 작동하므로 열에 대한 선언을 선언하거나 값을 전달하는 대신 비활성화하는 것은 정말 끔찍합니다 mor ein prod. 거기에서 mysql의 좋은 특성 중 하나를 비활성화합니다
zardilior

13

다른 사람들이 말했듯이 이것은 STRICT_TRANS_TABLESSQL 모드로 인해 발생 합니다.

STRICT_TRANS_TABLES모드가 활성화 되었는지 확인하려면 :

SHOW VARIABLES LIKE 'sql_mode';

엄격 모드를 비활성화하려면 :

SET GLOBAL sql_mode='';

테스트를 위해 변수> sql_mode에서 "STRICT_TRANS_TABLES"를 수동으로 제거하고 작동했습니다!
Prem popatia

1
당신은 내 하루를 구했습니다.
umarbilal

두 번째 명령을 실행하고 sql_mode (첫 번째 명령)를 확인한 후에는 아무것도하지 않습니다. mysql 서비스를 다시 시작한 후에도. 데비안 9
trainoasis

12

모든 삽입 작업 전에 아래 줄에 추가하고 문제를 해결했습니다.

SET SQL_MODE = '';

이것이 최선의 해결책인지 잘 모르겠습니다.

SET SQL_MODE = ''; INSERT INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');

1
모든 삽입 작업 전에이를 수행 할 필요가 없습니다. 스크립트 시작시 데이터베이스에 연결 한 직후에 한 번만 수행하면 모든 삽입 쿼리가 "필드에 기본값이 없습니다"오류없이 작동합니다.
José Carlos PHP

이 솔루션은 테이블을 변경할 필요가 없기 때문에 괜찮습니다 (변경할 필드가 많을 수 있음).
José Carlos PHP

11

작업 및 테스트 구성 파일로 복사 : /etc/mysql/my.cnf 또는 /bin/mysql/my.ini

[mysqld]
port = 3306
sql-mode=""

그런 다음 MySQL을 다시 시작하십시오.


9

쿼리를 수정하고 "IGNORE"를 다음과 같이 추가하십시오.

INSERT IGNORE INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');

이것은 나를 위해 일했습니다-내 PHP 스크립트가 중단되었지만 IGNORE를 사용하면 새 행을 광고합니다! 이제 IGNORE를 PHP-MYSQL 쿼리에 하드 코딩하는 것이 얼마나 "안전"합니까? 나는 이전에 존재하지 않았던 새로운 "일"에 대한 자동 추가 행이를 사용
Levchik

@Levchik IGNORE를 사용하면 오류 대신에 오류가 발생하면 MySQL이 경고를 표시하고 어떻게 든 명령을 완료하려고 시도합니다. mysqltutorial.org/mysql-insert-ignore
Stefan

6

Windows WampServer 사용자의 경우 :

WAMP> MySQL> my.ini

파일 검색 sql-mode=""

주석을 제거하십시오.


2
내 버전에서 나는 변화했다 : sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"sql-mode="". 주석 해제로 sql-mode=""인해 오류가 발생했습니다.
Julian

5

이것은에 의한 것으로 보인다 오랜 (2004 년 이후) MySQL의 버그 (# 6295) 라는 제목의,

NOT NULL 열에 대해서는 트리거가 처리되지 않습니다 .

2013 년 에 MySQL 5.7.1 버전 (Changelog, 마지막 항목) 에서 수정 된 것으로 알려 졌으며 MySQL이 "SQL 표준에 따라"(ibid) 작동하도록했습니다.


5.6에서 5.7.11로 업그레이드했고 문제가 해결되었습니다 (STRICT_TRANS_TABLES 제거가 효과가 없었습니다). 그래서 저는 이것을 찬성하고 나머지 답변에
반대 투표를하겠습니다

5
@knocte 모든 사람이 자신의 시스템에서 MySQL을 업그레이드 할 수있는 것은 아니므로 이에 찬성하여 투표 할 가치가 없습니다.
JulienD

나를 정말로 돕는 유일한 대답. NOT NULL제약 조건을 제거 하거나 열에 기본값을 추가하면 문제가 해결되었습니다. 트리거가 예상대로 작동합니다.
Ruslan Stelmachenko

3

Windows Server에서 my.ini 편집 (예 : program files \ mysql \ mysql server nn \ my.ini)

단순히 sql-mode = ""를 설정하는 것이 아니라 라인에서 STRICT_TRANS_TABLES를 제거하고 모든 것을 그대로 둔 다음 서비스 유틸리티에서 MySQL을 다시 시작하는 것이 좋습니다. 미래의 프로그래머에게 자신이 누구이며 무엇을했는지에 대한 의견을 추가하십시오.


이 대답은 동일합니다. stackoverflow.com/a/52004654/10431118
karma4917

일반적으로 그렇습니다.하지만 내 요점은 sql-mode의 모든 값을 비우지 않고 STRICT_TRANS_TABLES 만 제거하라는 것입니다. 그렇지 않으면 다른 서비스에 영향을 미칠 수 있습니다.
Bill Degnan

1

필드를 null이 아니고 문제가 해결되었습니다. 정보를 저장하라는 명령을 받으면 업데이트됩니다. 필드가 비어 있다는 msqli 메시지가 더 이상 표시되지 않습니다. 값을 삽입하지 않았습니다.이 솔루션의 응용 프로그램은 일부에서 작동 할 수 있습니다. 프로젝트는 프로젝트 구조에 따라 다릅니다.


열의 default속성을에서 none로 변경하여 내 오류를 해결 했습니다 NULL. 높은 등급의 답변이 아니라면! 내 cPanel은 변수 sql_mode를 업데이트하려고 할 때 공유 호스팅에서 거부 된 액세스를 제공했습니다.
Rashid

0

데이터 폴더에있는 my.ini 파일을 변경하는 문제를 해결했습니다. mysql 5.6의 경우 my.ini 파일이 bin 또는 mysql 설치 폴더가 아닌 데이터 폴더로 이동되었습니다.


0

이 경우 이름 열에 null 값이 있다고 생각합니다.

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