mysql error 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

มีวิธีระงับข้อผิดพลาดนี้โดยไม่ทำให้ฟิลด์ว่างเปล่าและโดยไม่ต้องลบทริกเกอร์ออกหรือไม่ มิฉะนั้นโหมดไฮเบอร์เนตของฉันจะเห็นข้อยกเว้นเหล่านี้ (แม้ว่าจะมีการแทรกแล้วก็ตาม) จากนั้นแอปพลิเคชันจะหยุดทำงาน

คำตอบ:


28

ตั้งค่าเริ่มต้นสำหรับCreated_By(เช่นว่างVARCHAR) และทริกเกอร์จะอัปเดตค่าต่อไป

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

จะตั้งค่าเริ่มต้นในโปรแกรม Java ได้อย่างไร?
Nagarajan Shanmuganathan

1
คุณต้องมีค่าเริ่มต้นในนิยามของตาราง (สร้าง table try (ชื่อ varchar (8), CREATED_BY varchar (40) DEFAULT '' not null))
KinSlayerUY

สิ่งนี้ไม่ได้แก้ไขปัญหาราก ดูคำตอบที่ครอบคลุมมากขึ้นโดย Phyxx ด้านล่าง
csvan

3
คำตอบของ @csvan Phyxx ไม่ได้ระบุสาเหตุที่แท้จริงเนื่องจากสาเหตุหลักคือข้อบกพร่องใน MySQL ที่ได้รับการแก้ไขใน v5.7.1 - ดูคำตอบโดย B98: stackoverflow.com/a/29854279/5389997 การลบโหมด sql ที่เข้มงวดมากขึ้นทำให้ MySQL มากขึ้น มีแนวโน้มที่จะเกิดข้อผิดพลาดด้านคุณภาพของข้อมูลดังนั้นการลบจึงไม่ใช่คำแนะนำที่ดีจริงๆ
เงา

205

สิ่งนี้เกิดจากSTRICT_TRANS_TABLESโหมด SQL ที่กำหนดในไฟล์

% PROGRAMDATA% \ MySQL \ MySQL เซิร์ฟเวอร์ 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
คุณสามารถเรียกใช้แบบสอบถาม SQL ภายในเครื่องมือจัดการฐานข้อมูลของคุณเช่น phpMyAdmin: -- verified that the mode was previously set select @@GLOBAL.sql_mode; -- UPDATE MODE SET @@global.sql_mode= 'YOUR_VALUE';
anasanjaria

5
แต่คุณอาจต้องการ STRICT_TRANS_TABLES หรือไม่
Andrew

ในกรณีของฉันฟิลด์เป็นประเภท DATETIME โดยตั้งค่าเริ่มต้นเป็น NULL และฉันยังคงเห็นข้อผิดพลาดเดียวกันฉันมีสองสคีมาในฐานข้อมูลเดียวกัน หนึ่งสำหรับการจัดเตรียมอีกรายการหนึ่งสำหรับการผลิตที่มีโครงสร้างตารางเดียวกัน มันทำงานในสคีมาเดียว แต่ใช้ไม่ได้กับอีกสคีมาที่มีโครงสร้างตารางเดียวกันทั้งสองอย่าง ฉันงงงวย .. ฉันไม่แน่ใจว่าเป็นปัญหากับ STRICT_TRANS_TABLES
dresh

1
ฉันลบ STRICT_TRANS_TABLES จาก /etc/my.cnf - ในบรรทัดเริ่มต้นด้วย sql_mode - และเริ่มบริการ mysql ใหม่และปัญหาก็หายไป
Mike Volmar

92

เปิด phpmyadmin และไปที่แท็บ 'เพิ่มเติม' และเลือกเมนูย่อย 'ตัวแปร' เลื่อนลงเพื่อค้นหาโหมด sql แก้ไขโหมด sql และลบ "STRICT_TRANS_TABLES" บันทึก


22
คำถามนี้เกี่ยวกับ MySQL และไม่ได้กล่าวถึง phpmyadmin โปรดอย่าคิดว่าทุกคนต้องวิ่ง
คริส

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เป็นโมฆะนั่นคือsql_mode = ""สำหรับข้อผิดพลาดอื่น ๆ ที่คล้ายกัน
maan81

เราเพิ่งอัปเกรด MySQL เป็น 5.7 เราประสบปัญหามากเกินไป สิ่งนี้ได้ผลสำหรับฉัน บันทึกวันของฉัน
นักเรียน

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 ด้วยบัญชีรูท :) super account
user889030

1
หลังจากใช้เวลาสี่ชั่วโมงโซลูชันนี้ใช้ได้กับฉันใน Ubuntu 16.04 เยี่ยมมาก!
Waleed Ahmed

3
คุณไม่จำเป็นต้องphpmyadminใช้เลยใช้คำสั่งเหล่านี้ในmysqlบรรทัดคำสั่ง
gustyaquino

4
สิ่งนี้จะรีเซ็ตเป็นค่าเริ่มต้นหลังจากรีสตาร์ท mysql / server / pc คุณจำเป็นต้องแก้ไข /etc/mysql/mysql.conf.d/mysqld.cnf และหลังจาก [mysqld] เพิ่มบรรทัดนี้: sql_mode = 'ONLY_FULL_GROUP_BY, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_UBSTITUTION'
waza123

วิธีแก้ปัญหาโดย @ waza123 อันนี้ใช้ได้กับฉันหลังจากอัปเกรดเป็น mysql 5.7.20 ขอบคุณ
fredy kardian

28

เมื่อฉันมีปัญหาเดียวกันกับ mysql5.6.20 ที่ติดตั้งกับ Homebrew ฉันแก้ไขได้โดยไปที่ 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 console:

mysql -u your_username -p

เลือกฐานข้อมูล:

USE your_database;

และเรียกใช้ (จากคอนโซล mysql):

SET GLOBAL sql_mode='';

นั่นจะเป็นการปิดโหมดเข้มงวดและ mysql จะไม่บ่นอีกต่อไป

เพื่อให้สิ่งต่างๆชัดเจน: คำจำกัดความฐานข้อมูลของคุณระบุว่า "ฟิลด์นี้ต้องมีการกำหนดค่าเริ่มต้น" และเมื่อทำตามขั้นตอนจากด้านบนคุณจะพูดกับ MySql "neah เพียงแค่เพิกเฉย" ดังนั้นหากคุณต้องการแก้ไขอย่างรวดเร็วในเครื่องวิธีนี้ก็โอเค แต่โดยทั่วไปคุณควรตรวจสอบในนิยามฐานข้อมูลของคุณและตรวจสอบว่าฟิลด์นั้นต้องการค่าดีฟอลต์จริงหรือไม่และหากตั้งเป็นเช่นนั้น และหากไม่ต้องการค่าดีฟอลต์ข้อกำหนดนี้ควรลบออกเพื่อให้มีสถานการณ์ที่สะอาด


อย่าเพิ่มค่าเริ่มต้นเพียงแค่ลบกฎวิธีแก้ปัญหาที่ยอดเยี่ยม (การถากถางโดยนัย) ไม่เคยทำเช่นนี้เป็นตัวอย่างที่ไม่ดี มันช่วยแก้ปัญหาได้
zardilior

1
ใช่เห็นด้วยกับคุณ แต่บางครั้งคุณมีโปรเจ็กต์ของคนอื่นซึ่งทำงานได้ดีเช่นในการผลิต (โดยที่ไม่ได้ตั้งค่าโหมดที่เข้มงวด) และคุณแค่ต้องการเพิ่มฟีเจอร์เล็ก ๆ หรือแก้ไขข้อบกพร่องซึ่งทำงานในพื้นที่ คุณไม่ต้องการต่อสู้กับมังกรเพียงเพื่อให้สิ่งนั้นทำงานได้ :)
MilanG

สำหรับสถานการณ์นั้นฉันเห็นด้วย
zardilior

@zardilior มีปัญหาอะไร? ค่าเริ่มต้นจะถูกเลือกตามประเภทคอลัมน์หากกฎถูกลบออก .. ฉันไม่เห็นอะไรผิดปกติ: / กฎนั้นค่อนข้างรุนแรงโดยไม่มีเหตุผล
Reloecc

1
ไม่รุนแรงเลยเพียงแค่บังคับให้คุณต้องประกาศค่าเริ่มต้นหรือระบุค่านอกจากนี้โหมดที่เข้มงวดยังใช้งานได้มากกว่านั้นเท่านั้นดังนั้นการปิดใช้งานแทนที่จะประกาศข้อผิดพลาดในคอลัมน์หรือส่งผ่านค่านั้นแย่มาก mor ein prod. คุณปิดการใช้งาน mysql good charactersitics ที่นั่น
zardilior

13

ดังที่คนอื่น ๆ กล่าวว่าเกิดจากSTRICT_TRANS_TABLESโหมด SQL

วิธีตรวจสอบว่าSTRICT_TRANS_TABLESเปิดใช้งานโหมดหรือไม่:

SHOW VARIABLES LIKE 'sql_mode';

ในการปิดโหมดเข้มงวด:

SET GLOBAL sql_mode='';

ลบ "STRICT_TRANS_TABLES" ด้วยตนเองจากตัวแปร> sql_mode สำหรับการทดสอบและใช้งานได้!
Prem popatia

1
คุณช่วยวันของฉัน
umarbilal

สำหรับฉันหลังจากรันคำสั่งที่สองและตรวจสอบ sql_mode (คำสั่งที่ 1) มันไม่ได้ทำอะไรเลย แม้ว่าจะเริ่มบริการ mysql ใหม่แล้วก็ตาม Debian 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

ทำงานและทดสอบคัดลอกไปยังไฟล์ Config: /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) (# 6295) ใน MySQL ที่ชื่อว่า

ทริกเกอร์จะไม่ประมวลผลสำหรับคอลัมน์โมฆะไม่

มันถูกกล่าวหาว่าได้รับการแก้ไขในเวอร์ชัน5.7.1 ของ MySQL (การเปลี่ยนแปลงรายการสุดท้าย)ในปี 2013 ทำให้ MySQL ทำงานเป็น "ตามมาตรฐาน SQL" (ibid)


ฉันอัปเกรดจาก 5.6 เป็น 5.7.11 และปัญหาได้รับการแก้ไขแล้วสำหรับฉัน (และการลบ STRICT_TRANS_TABLES ไม่ได้ผลสำหรับฉัน) ดังนั้นฉันจึงเพิ่มคะแนนและลดคะแนนคำตอบที่เหลือ
knocte

5
@knocte ไม่ใช่ทุกคนที่สามารถอัปเกรด MySQL ในระบบของเขาได้ดังนั้นจึงไม่คุ้มที่จะลงคะแนนในสิ่งนี้
JulienD

คำตอบเดียวที่ช่วยฉันได้จริงๆ การลบNOT NULLข้อ จำกัด หรือเพิ่มค่าเริ่มต้นให้กับคอลัมน์ช่วยแก้ปัญหาได้ ทริกเกอร์ทำงานตามที่คาดไว้
Ruslan Stelmachenko

3

ใน Windows Server แก้ไข my.ini (ตัวอย่างเช่นไฟล์โปรแกรม \ mysql \ mysql เซิร์ฟเวอร์ nn \ my.ini)

ฉันจะไม่เพียงแค่ตั้งค่า sql-mode = "" แต่ฉันขอแนะนำให้คนหนึ่งลบ STRICT_TRANS_TABLES ออกจากบรรทัดปล่อยให้ทุกอย่างเหมือนเดิมจากนั้นรีสตาร์ท MySQL จากยูทิลิตี้บริการ เพิ่มความคิดเห็นสำหรับโปรแกรมเมอร์ในอนาคตว่าคุณเป็นใครและเคยทำอะไร


คำตอบนี้บอกเหมือนกัน stackoverflow.com/a/52004654/10431118
karma4917

โดยทั่วไปพูดว่าใช่ แต่ประเด็นของฉันคือฉันพูดโดยเฉพาะว่าจะไม่เว้นว่างค่าทั้งหมดของโหมด sql แต่ให้ลบเฉพาะ STRICT_TRANS_TABLES เท่านั้นเพราะนั่นคือทั้งหมดที่คุณต้องการ มิฉะนั้นคุณอาจส่งผลกระทบต่อบริการอื่น ๆ
Bill Degnan

1

ฉันตั้งค่าฟิลด์ให้ไม่เป็นโมฆะและแก้ไขปัญหาได้มันจะอัปเดตเมื่อข้อมูลถูกสั่งให้เก็บไว้ในนั้นไม่แสดงข้อความ msqli อีกต่อไปว่าฟิลด์นั้นว่างเปล่าเพราะคุณไม่ได้ใส่ค่าลงไปการใช้งานโซลูชันนี้สามารถใช้ได้กับบางส่วน โครงการขึ้นอยู่กับโครงสร้างโครงการของคุณ


มันแก้ไขข้อผิดพลาดของฉันโดยการเปลี่ยนคอลัมน์defaultแอตทริบิวต์จากไปnone NULLเว้นแต่คำตอบที่ได้คะแนนสูง! cPanel ของฉันให้การเข้าถึงถูกปฏิเสธบนโฮสติ้งที่ใช้ร่วมกันเมื่อฉันพยายามอัปเดตตัวแปร sql_mode
Rashid

0

ฉันแก้ไขปัญหาในการเปลี่ยนไฟล์ my.ini ที่อยู่ในโฟลเดอร์ข้อมูล สำหรับไฟล์ mysql 5.6 my.ini ย้ายไปยังโฟลเดอร์ข้อมูลแทนที่จะเป็นโฟลเดอร์การติดตั้ง bin หรือ mysql


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.