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

有没有一种方法可以抑制此错误,而又不使字段可为空并且不删除触发器?否则,我的休眠状态将看到这些异常(即使已经进行了插入),然后应用程序将崩溃。

Answers:


28

设置默认值Created_By(例如:empty VARCHAR),触发器将始终更新该值。

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

如何在Java程序中设置默认值?
Nagarajan Shanmuganathan

1
您需要在表的定义中使用默认值(创建表try(名称varchar(8),CREATED_BY varchar(40)DEFAULT“不为null)))
KinSlayerUY

这不能解决根本问题。请参阅下面Phyxx的更广泛的答案。
csvan '17

3
@csvan Phyxx的答案不能解决根本原因,因为根本原因是v5.7.1中已修复的MySQL中的错误-请参阅B98的答案:stackoverflow.com/a/29854279/5389997 删除strict_trans_table sql模式会使MySQL更多容易出现数据质量错误,因此删除它并不是一个很好的建议。
阴影

204

这是由于STRICT_TRANS_TABLES

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

文件。删除该设置并重新启动MySQL应该可以解决该问题。

参见https://www.farbeyondcode.com/Solution-for-MariaDB-字段--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吗?
安德鲁

在我的情况下,该字段的类型为DATETIME,默认设置为NULL,我仍然看到相同的错误,我在同一数据库上有两个架构。一个用于登台,另一个用于生产,具有相同的表结构。它可以在一种模式下工作,但不能在两种表具有完全相同的表结构的环境下工作。我感到困惑。.我不确定这是STRICT_TRANS_TABLES的问题
dresh

1
我从/etc/my.cnf中删除了STRICT_TRANS_TABLES-在以sql_mode开头的行中-然后重新启动了mysql服务,问题消失了。
Mike Volmar

92

打开phpmyadmin并转到“更多”标签,然后选择“变量”子菜单。向下滚动以查找sql​​模式。编辑sql模式并删除'STRICT_TRANS_TABLES'保存。


22
这个问题是关于MySQL的,没有提及phpmyadmin。请不要以为每个人都在运行。
克里斯

2
@ jackadams49此更改不会保留。您能告诉我在重新启动系统后所做的更改吗?
LD詹姆斯

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 '16

我们最近将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用root帐户:)超级帐户
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

当我用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说“ neah,忽略它”。因此,如果您只想在本地进行一些快速修复,则可以使用此解决方案。但是通常,您应该调查数据库定义,并检查字段是否确实需要默认值,如果需要,请进行设置。如果不需要默认值,则应删除此要求以保持干净。


是的,不要添加默认值,而只是删除规则,很棒的解决方案(暗含讽刺意味)永远不会做一个不好的例子。这虽然解决了这个问题
zardilior

1
是的,同意你的观点。但是有时您会得到其他人的项目,该项目运行良好,即在生产中(未设置严格模式),并且您只想添加一些小的功能或错误修正,就可以在本地工作。您不想与龙搏斗,只是为了使那件事变得可行。:)
MilanG

对于这种情况,我同意
zardilior

@zardilior有什么问题?如果删除了规则,则根据列类型选择默认值。
Reloecc

1
一点都不苛刻,它只会迫使您声明一个默认值或提供一个值,严格模式还可以起到更多作用,因此禁用它,而不是在列上声明默认值或传递值,确实很糟糕莫林产品 您禁用那里的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
你救了我的日子。
脐带

对我来说,运行第二条命令并检查sql_mode(第一条命令)后,它什么都不做。即使重启mysql服务。Debian 9
Trainoasis

12

在执行每个插入操作之前,我在下面添加了行并解决了我的问题,

SET SQL_MODE = '';

我不确定这是否是最好的解决方案,

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

1
不需要在每个插入操作之前执行此操作,只需在脚本开始时执行一次,就在连接数据库之后,并且每个插入查询都可以正常工作,而不会出现“字段没有默认值”错误。
何塞·卡洛斯·PHP

此解决方案很好,因为您不需要更改表(可能有很多字段需要更改)。
何塞·卡洛斯·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=""导致错误。
朱利安

5

这似乎是由于MySQL中的一个长期(自2004年以来)错误(#6295)引起的,标题为

不为NOT NULL列处理触发器

据称,它已在2013年的MySQL 5.7.1(Changelog,最后一个条目)中修复,使MySQL的行为“符合SQL标准”(同上)。


我从5.6升级到5.7.11,问题已为我解决(删除STRICT_TRANS_TABLES对我而言不起作用),因此我对此表示赞同,并对其余答案
不赞成

5
@knocte并非每个人都可以在他的系统上升级MySQL,因此不值得为此一票。
JulienD

唯一可以真正帮助我的答案。删除NOT NULL约束或将默认值添加到列可解决此问题。触发器按预期方式工作。
Ruslan Stelmachenko '18年

3

在Windows Server中,编辑my.ini(例如,程序文件\ mysql \ mysql服务器nn \ my.ini)

我不会简单地设置sql-mode =“”,而是建议从该行中删除STRICT_TRANS_TABLES,将所有内容保持不变,然后从服务实用程序中重新启动MySQL。为将来的程序员,您的身份和所做的事情添加注释。


这个答案说的也是一样。stackoverflow.com/a/52004654/10431118
karma4917 '18

一般来说,是的,但是我的意思是,我要特别说明的是不要清除sql-mode的所有值,而是只删除STRICT_TRANS_TABLES,这就是您所需要的。否则,您可能会影响其他服务。
Bill Degnan '18

1

我将字段设置为不为null并解决了问题,当命令将信息存储在其中时更新了该字段,不再显示msqli消息,表明该字段为空,因为您没有向其插入值,因此该解决方案的应用可以在某些情况下起作用项目取决于您的项目结构。


它通过改变列的解决了我的错误default,从属性noneNULL。除非获得高评分答案!当我尝试更新变量sql_mode时,我的cPanel使我无法访问共享主机。
拉希德

0

我解决了更改数据文件夹中的my.ini文件的问题。对于mysql 5.6,my.ini文件已移动到数据文件夹,而不是bin或mysql安装文件夹。


0

我认为在这种情况下,名称列中的值为空。

update try set name='abc' where created_by='def';
  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.