mysql错误1364字段没有默认值

时间:2013-03-15 17:41:48

标签: mysql

我的表格似乎是

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

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

17 个答案:

答案 0 :(得分:187)

这是由

中定义的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了解配置文件的其他可能位置。

答案 1 :(得分:81)

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

答案 2 :(得分: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

错误消失了!

答案 3 :(得分:28)

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

答案 4 :(得分:22)

设置Created_By的默认值(例如:空VARCHAR),触发器仍会更新该值。

答案 5 :(得分:9)

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

SET SQL_MODE = '';

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

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

答案 6 :(得分:8)

它的工作和测试复制到配置文件:/etc/mysql/my.cnf或/bin/mysql/my.ini

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

然后重启MySQL

答案 7 :(得分:6)

对于Windows WampServer 用户:

WAMP> MySQL>的my.ini

搜索sql-mode=""

的文件

取消注释。

答案 8 :(得分:6)

修改您的查询并添加" IGNORE"为:

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

答案 9 :(得分:5)

这似乎是由长期(自2004年起)bug (#6295) in MySQL引起的,标题为

  

不处理NOT NULL列的触发器

据称它在2013年版本5.7.1 of MySQL (Changelog, last entry)中被修复,使得MySQL的行为符合“按照SQL标准”(同上)。

答案 10 :(得分:5)

正如其他人所说,这是由STRICT_TRANS_TABLES SQL模式引起的。

要检查是否已启用STRICT_TRANS_TABLES模式:

SHOW VARIABLES LIKE 'sql_mode';

要禁用严格模式:

SET GLOBAL sql_mode='';

答案 11 :(得分:3)

运行mysql控制台:

mysql -u your_username -p

,选择数据库:

USE your_database;

并运行(同样从mysql控制台):

SET GLOBAL sql_mode='';

这将关闭严格模式,并且mysql将不再抱怨。

答案 12 :(得分:0)

我将字段设置为非空并且问题已解决,当命令信息存储在其中时它会更新,不再显示该字段为空的msqli消息cus你没有插入值,这个解决方案的应用可以很好某些项目的工作取决于您的项目结构。

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

update try set name='abc' where created_by='def';
  

答案 16 :(得分:0)

我在 Linux 上使用 Xampp 7.3.28-1。它使用 MariaDB 10.4.19。它的配置文件是: /opt/lampp/etc/my.cnf

它不包含定义 sql_mode 的条目。 但是查询“select @@GLOBAL.sql_mode;”确实返回一个结果,它包含有问题的 STRICT_TRANS_TABLES。我猜现在是默认设置。

我的解决方案是通过在 [mysqld] 下方添加这一行来明确定义模式: sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

您可以定义所需的模式,也可以将其留空。