Lỗi mysql 1364 Trường không có giá trị mặc định


113

Bàn của tôi trông giống như

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

và sau đó tôi có một trình kích hoạt để tự động điền trường CREATED_BY

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

Khi tôi chèn bằng cách sử dụng

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

mục nhập được tạo trong bảng nhưng tôi vẫn nhận được thông báo lỗi

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

Có cách nào để loại bỏ lỗi này mà không làm cho trường vô hiệu AND mà không xóa triggfer không? Nếu không, chế độ ngủ đông của tôi sẽ thấy những ngoại lệ này (mặc dù đã thực hiện chèn) và sau đó ứng dụng sẽ sập.

Câu trả lời:


28

Đặt giá trị mặc định cho Created_By(ví dụ: trống VARCHAR) và trình kích hoạt sẽ cập nhật giá trị bất cứ lúc nào.

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

Cách đặt giá trị mặc định trong chương trình Java?
Nagarajan Shanmuganathan

1
bạn cần có một giá trị mặc định trong định nghĩa của bảng (tạo bảng thử (tên varchar (8), CREATED_BY varchar (40) DEFAULT '' không null))
KinSlayerUY

Điều này không giải quyết vấn đề gốc. Xem câu trả lời mở rộng hơn của Phyxx bên dưới.
csvan 17/02/17

3
Câu trả lời của @csvan Phyxx cũng không giải quyết được nguyên nhân gốc rễ vì nguyên nhân gốc là một lỗi trong MySQL đã được sửa trong v5.7.1 - xem câu trả lời của B98: stackoverflow.com/a/29854279/5389997 Xóa chế độ sql nghiêm ngặt_trans_table làm cho MySQL nhiều hơn Dễ bị lỗi chất lượng dữ liệu, vì vậy việc loại bỏ nó không phải là một lời khuyên thực sự tốt.
Bóng

204

Điều này là do STRICT_TRANS_TABLESchế độ SQL được xác định trong

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

tập tin. Xóa cài đặt đó và khởi động lại MySQL sẽ khắc phục được sự cố.

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

Nếu việc chỉnh sửa tệp đó không khắc phục được sự cố, hãy xem http://dev.mysql.com/doc/refman/5.6/en/option-files.html để biết các vị trí có thể có khác của tệp cấu hình.


5
Bạn có thể chạy một truy vấn SQL trong công cụ quản lý cơ sở dữ liệu của bạn, chẳng hạn như phpMyAdmin: -- verified that the mode was previously set select @@GLOBAL.sql_mode; -- UPDATE MODE SET @@global.sql_mode= 'YOUR_VALUE';
anasanjaria

5
nhưng có thể bạn muốn STRICT_TRANS_TABLES?
Andrew

trong trường hợp của tôi, trường thuộc loại DATETIME với đặt mặc định là NULL và tôi vẫn gặp lỗi tương tự, tôi có hai lược đồ trên cùng một cơ sở dữ liệu. một cho Staging, một cho sản xuất, có cùng cấu trúc bảng. Nó hoạt động trong một lược đồ, nhưng không hoạt động trong một lược đồ khác với cấu trúc bảng giống hệt nhau trong cả hai. Tôi bối rối .. Tôi không chắc đó có phải là vấn đề với STRICT_TRANS_TABLES
mới

1
Tôi đã xóa STRICT_TRANS_TABLES khỏi /etc/my.cnf - trong dòng bắt đầu bằng sql_mode - và khởi động lại dịch vụ mysql và sự cố đã biến mất.
Mike Volmar

92

Mở phpmyadmin và chuyển đến Tab 'Khác' và chọn menu con 'Biến'. Cuộn xuống để tìm chế độ sql. Chỉnh sửa chế độ sql và xóa 'STRICT_TRANS_TABLES' Lưu nó.


22
Câu hỏi này là về MySQL và không đề cập đến phpmyadmin. Xin đừng cho rằng mọi người đều chạy như vậy.
Chris

2
@ jackadams49 Thay đổi này không thành công. Bạn có thể cho tôi biết bạn đã làm gì để thay đổi này tồn tại sau khi hệ thống khởi động lại không?
LD James

8
@ jackadams49 để làm cho nó ở lại, sudo nano /etc/mysql/my.cnf, thêm [mysqld] sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", tiết kiệm và xuất cảnh, và mysql khởi động lại sudo service mysql restart
maan81

1
Để thêm, tôi đã phải thay đổi các giá trị sql_modethành null, tức là sql_mode = ""đối với các lỗi tương tự khác.
maan81

Gần đây chúng tôi đã nâng cấp MySQL của mình lên 5.7. Chúng tôi đã phải đối mặt với quá nhiều vấn đề. Điều này đã làm việc cho tôi. Đã lưu ngày của tôi.
Học sinh

38

Trong phpmyadmin, hãy thực hiện như sau:

select @@GLOBAL.sql_mode

Trong trường hợp của tôi, tôi nhận được như sau:

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

Sao chép kết quả này và xóa STRICT_TRANS_TABLES. Sau đó thực hiện như sau:

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'

ya nhưng cho rằng bạn sẽ cần phải đăng nhập để phpmyadmin với tài khoản root :) tài khoản siêu
user889030

1
sau bốn giờ, giải pháp này đã hoạt động với tôi trong Ubuntu 16.04. Tuyệt quá !
Waleed Ahmed

3
bạn không cần phpmyadmingì cả, hãy sử dụng các lệnh này trên mysqldòng lệnh.
gustyaquino

4
điều này sẽ đặt lại về mặc định sau khi khởi động lại mysql / server / pc. Bạn cần phải chỉnh sửa /etc/mysql/mysql.conf.d/mysqld.cnf, và sau [mysqld] thêm dòng này: 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

giải pháp của @ waza123, giải pháp này phù hợp với tôi sau khi nâng cấp lên mysql 5.7.20. thanks
kardian Fredy

28

Khi tôi gặp vấn đề tương tự với mysql5.6.20 được cài đặt bằng Homebrew, tôi đã giải quyết nó bằng cách truy cập my.cnf

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

Tìm dòng trông giống như vậy:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

Nhận xét ở trên dòng ra và khởi động lại máy chủ mysql

mysql.server restart

Đã xảy ra lỗi!


15

Chạy bảng điều khiển mysql:

mysql -u your_username -p

, chọn cơ sở dữ liệu:

USE your_database;

và chạy (cũng từ bảng điều khiển mysql):

SET GLOBAL sql_mode='';

Điều đó sẽ tắt chế độ nghiêm ngặt và mysql sẽ không phàn nàn gì nữa.

Để làm rõ ràng mọi thứ: định nghĩa cơ sở dữ liệu của bạn cho biết "trường này phải có giá trị mặc định được xác định" và bằng cách thực hiện các bước từ trên, bạn nói với MySql "neah, chỉ cần bỏ qua nó". Vì vậy, nếu bạn chỉ muốn thực hiện một số sửa chữa nhanh cục bộ, giải pháp này là ok. Nhưng nói chung, bạn nên điều tra trong định nghĩa cơ sở dữ liệu của mình và kiểm tra xem trường có thực sự cần giá trị mặc định hay không và nếu có thì hãy đặt nó. Và nếu giá trị mặc định là không cần thiết, yêu cầu này nên được loại bỏ để có tình trạng sạch sẽ.


Vâng không thêm mặc định chỉ cần loại bỏ các quy tắc, giải pháp tuyệt vời (ngụ ý mỉa mai) không bao giờ làm điều này một ví dụ xấu tuyệt vời. Nó giải quyết các vấn đề mặc dù
zardilior

1
Vâng, đồng ý với bạn. Nhưng đôi khi bạn nhận được dự án của một số người khác, dự án này đang chạy tốt, tức là trên sản xuất (nơi chế độ nghiêm ngặt không được đặt) và bạn chỉ muốn thêm một số tính năng nhỏ hoặc bản sửa lỗi, hoạt động cục bộ. Bạn không muốn chiến đấu với những con rồng, chỉ để làm cho nó hoạt động. :)
MilanG

cho kịch bản mà tôi đồng ý
zardilior

@zardilior có vấn đề gì không? giá trị mặc định được chọn dựa trên loại cột nếu quy tắc bị xóa .. Tôi không thấy có gì sai về nó: / quy tắc đó khá khắc nghiệt mà không có lý do gì.
Reloecc

1
Không quá khắc nghiệt, nó chỉ buộc bạn phải khai báo một giá trị mặc định hoặc cung cấp một giá trị, còn chế độ nghiêm ngặt hoạt động cho nhiều thứ hơn thế, vì vậy việc vô hiệu hóa nó, thay vì khai báo một deault trên cột hoặc truyền giá trị, thực sự khủng khiếp mor ein prod. Bạn vô hiệu hóa một trong những ký tự tốt của mysql ở đó
zardilior

13

Như những người khác đã nói, điều này là do STRICT_TRANS_TABLESchế độ SQL gây ra .

Để kiểm tra xem STRICT_TRANS_TABLESchế độ đã được bật hay chưa:

SHOW VARIABLES LIKE 'sql_mode';

Để tắt chế độ nghiêm ngặt:

SET GLOBAL sql_mode='';

Đã xóa thủ công "STRICT_TRANS_TABLES" khỏi các biến> sql_mode để thử nghiệm và nó đã hoạt động!
Prem popatia

1
Bạn đã cứu ngày của tôi.
umarbilal

Đối với tôi sau khi chạy lệnh thứ hai và kiểm tra sql_mode (lệnh thứ nhất), nó không làm gì cả. Ngay cả sau khi khởi động lại dịch vụ mysql. Debian 9
trainoasis

12

Trước mỗi hành động chèn, tôi đã thêm dòng dưới đây và giải quyết vấn đề của mình,

SET SQL_MODE = '';

Tôi không chắc liệu đây có phải là giải pháp tốt nhất hay không,

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

1
Không cần thiết phải làm điều đó trước mỗi hành động chèn, chỉ cần thực hiện một lần khi có tập lệnh của bạn, ngay sau khi kết nối với cơ sở dữ liệu và mọi truy vấn chèn sẽ hoạt động mà không có lỗi "Trường không có giá trị mặc định".
José Carlos PHP

Giải pháp này ổn vì bạn không cần phải thay đổi bảng (có thể có nhiều trường để thay đổi).
José Carlos PHP

11

Công việc của nó và đã thử nghiệm Sao chép vào Tệp cấu hình: /etc/mysql/my.cnf HOẶC /bin/mysql/my.ini

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

sau đó khởi động lại MySQL


9

Sửa đổi truy vấn của bạn và thêm "BỎ QUA" làm:

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

điều này đã làm việc cho tôi - tập lệnh PHP của tôi sẽ bị hủy bỏ, nhưng với BỎ QUA, nó chỉ quảng cáo hàng mới! Bây giờ, làm thế nào "an toàn" để BỎ QUA mã cứng vào truy vấn PHP-MYSQL? Tôi sử dụng điều này để tự động thêm hàng, cho "ngày" mới, nơi nó không tồn tại trước đây
Levchik

@Levchik Khi bạn sử dụng bỏ qua, sau đó thay vì một lỗi, MySQL đưa ra một cảnh báo khi lỗi xảy ra, thay vào đó, và sẽ cố gắng để hoàn thành các chỉ dẫn bằng cách nào đó: mysqltutorial.org/mysql-insert-ignore
Stefan

6

Đối với người dùng Windows WampServer :

WAMP> MySQL> my.ini

tìm kiếm tập tin cho sql-mode=""

Bỏ ghi chú nó.


2
Trong phiên bản của tôi, tôi đã phải thay đổi: 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"thành sql-mode="". Bỏ ghi chú sql-mode=""gây ra lỗi.
Julian

5

Điều này dường như được gây ra bởi một lỗi lâu dài (từ năm 2004) (# 6295) trong MySQL , có tiêu đề

Trình kích hoạt không được xử lý cho các cột KHÔNG ĐẦY ĐỦ .

Nó được cho là đã được sửa trong phiên bản 5.7.1 của MySQL (Changelog, mục cuối cùng) vào năm 2013, khiến MySQL hoạt động như “theo tiêu chuẩn SQL” (ibid).


Tôi nâng cấp từ 5,6 đến 5.7.11 và vấn đề đã được cố định cho tôi (và việc loại bỏ các STRICT_TRANS_TABLES không làm việc cho tôi), vì vậy tôi upvoting này và downvoting phần còn lại của câu trả lời
knocte

5
@knocte Không phải ai cũng có thể nâng cấp MySQL trên hệ thống của mình, vì vậy không đáng để ủng hộ điều này.
JulienD

Câu trả lời duy nhất thực sự giúp tôi. Loại bỏ NOT NULLràng buộc hoặc thêm giá trị mặc định vào cột đã khắc phục sự cố. Trình kích hoạt hoạt động như mong đợi.
Ruslan Stelmachenko

3

Trong Windows Server, hãy chỉnh sửa my.ini (ví dụ: tệp chương trình \ mysql \ mysql server nn \ my.ini)

Tôi sẽ không chỉ đơn giản đặt sql-mode = "", thay vào đó tôi đề nghị loại bỏ STRICT_TRANS_TABLES khỏi dòng, giữ nguyên mọi thứ và sau đó khởi động lại MySQL từ tiện ích dịch vụ. Thêm nhận xét cho các lập trình viên tương lai bạn là ai và bạn đã làm gì.


Câu trả lời này nói với cùng một. stackoverflow.com/a/52004654/10431118
karma4917

Nói chung là có, nhưng quan điểm của tôi là tôi đang nói cụ thể không bỏ trống tất cả các giá trị của chế độ sql, mà chỉ xóa STRICT_TRANS_TABLES thôi, vì đó là tất cả những gì bạn cần. Nếu không, bạn có thể ảnh hưởng đến một số dịch vụ khác.
Bill Degnan

1

tôi đặt các trường thành không rỗng và vấn đề đã được giải quyết, nó cập nhật khi một thông tin được lệnh lưu trữ trong đó, không còn hiển thị thông báo msqli rằng trường trống vì bạn không chèn giá trị vào nó, ứng dụng của giải pháp này có thể hoạt động trên một số dự án phụ thuộc vào cấu trúc dự án của bạn.


Nó đã giải quyết lỗi của tôi bằng cách thay đổi defaultthuộc tính của cột từ nonethành NULL. Trừ khi có câu trả lời xếp hạng cao! cPanel của tôi đã cấp cho tôi quyền truy cập bị từ chối trên lưu trữ được chia sẻ khi tôi cố gắng cập nhật biến sql_mode.
Rashid

0

tôi đã giải quyết vấn đề khi thay đổi tệp my.ini nằm trong thư mục dữ liệu. đối với tệp my.ini mysql 5.6 được chuyển đến thư mục dữ liệu thay vì thư mục cài đặt bin hoặc mysql.


0

Tôi nghĩ rằng trong cột tên có giá trị null trong trường hợp này.

update try set name='abc' where created_by='def';
  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.