mysql错误1364字段没有默认值

kk1*_*957 97 mysql

我的桌子看起来像

create table try ( name varchar(8), CREATED_BY varchar(40) not null);
Run Code Online (Sandbox Code Playgroud)

然后我有一个触发器来自动填充CREATED_BY字段

create trigger autoPopulateAtInsert BEFORE INSERT on try for each row set new.CREATED_BY=user();
Run Code Online (Sandbox Code Playgroud)

当我使用插入时

insert into try (name) values ('abc');
Run Code Online (Sandbox Code Playgroud)

该条目在表中进行,但我仍然收到错误消息

Field 'CREATED_BY' doesn't have a default value Error no 1364
Run Code Online (Sandbox Code Playgroud)

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

Phy*_*yxx 193

这是由于在中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以获取配置文件的其他可能位置.

  • 您可以在数据库管理工具中运行SQL查询,例如phpMyAdmin:` - 验证模式先前已设置select @@ GLOBAL.sql_mode; - UPDATE MODE SET @@ global.sql_mode ='YOUR_VALUE';` (5认同)
  • 但也许你想要STRICT_TRANS_TABLES? (5认同)
  • 我从 /etc/my.cnf 中删除了 STRICT_TRANS_TABLES - 在以 sql_mode 开头的行中 - 并重新启动了 mysql 服务,问题就消失了。 (3认同)

小智 87

打开phpmyadmin并转到'More'Tab并选择'Variables'子菜单.向下滚动以查找sql​​模式.编辑sql模式并删除'STRICT_TRANS_TABLES'保存它.

  • 这个问题是关于MySQL的,并没有提到phpmyadmin.请不要认为每个人都有这种情况. (20认同)
  • @ 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 ` (8认同)
  • @ jackadams49这个改变不坚持.你能告诉我你做了什么让这个改变在系统重启后幸免于难吗? (2认同)

Kam*_*mil 36

在phpmyadmin中,执行以下操作:

select @@GLOBAL.sql_mode
Run Code Online (Sandbox Code Playgroud)

就我而言,我得到以下内容:

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
Run Code Online (Sandbox Code Playgroud)

复制此结果并删除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'
Run Code Online (Sandbox Code Playgroud)

  • 在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' (4认同)
  • 你根本不需要`phpmyadmin`,在`mysql`命令行上使用这些命令. (3认同)
  • 花了四个小时后,这个解决方案在 Ubuntu 16.04 中对我有用。伟大的 ! (2认同)

Kin*_*mah 29

当我在使用Homebrew安装mysql5.6.20时出现同样的问题时,我通过进入my.cnf解决了这个问题

nano /usr/local/Cellar/mysql/5.6.20_1/my.cnf
Run Code Online (Sandbox Code Playgroud)

找到看起来像这样的行:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Run Code Online (Sandbox Code Playgroud)

注释上面的行并重新启动mysql服务器

mysql.server restart
Run Code Online (Sandbox Code Playgroud)

错误消失了!


Kin*_*rUY 25

设置Created_By(例如:空VARCHAR)的默认值,触发器将反正更新该值.

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

小智 10

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

SET SQL_MODE = '';
Run Code Online (Sandbox Code Playgroud)

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

SET SQL_MODE = ''; INSERT INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');
Run Code Online (Sandbox Code Playgroud)


Dam*_*ica 10

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

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

SHOW VARIABLES LIKE 'sql_mode';
Run Code Online (Sandbox Code Playgroud)

要禁用严格模式:

SET GLOBAL sql_mode='';
Run Code Online (Sandbox Code Playgroud)


Dev*_*pta 8

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

[mysqld]
port = 3306
sql-mode=""
Run Code Online (Sandbox Code Playgroud)

然后重启MySQL


小智 7

修改查询并将“ IGNORE”添加为:

INSERT IGNORE INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');
Run Code Online (Sandbox Code Playgroud)


And*_*rew 6

对于Windows WampServer用户:

WAMP> MySQL> my.ini

搜索文件 sql-mode=""

取消注释.

  • 在我的版本,我不得不改变:`SQL模式= "STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER" SQL模式= "STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"`到`SQL模式= ""`.取消注释`sql-mode =""`导致错误. (2认同)

B98*_*B98 5

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

NOT NULL列不处理触发器.

据称,它在2013年的MySQL版本5.7.1(更改日志,最后一个条目)中被修复,使得MySQL表现为"按照SQL标准"(同上).

  • @knocte并不是每个人都可以在他的系统上升级MySQL,所以不值得为此支持downvoting. (5认同)

Mil*_*anG 5

运行mysql控制台:

mysql -u your_username -p
Run Code Online (Sandbox Code Playgroud)

,选择数据库:

USE your_database;
Run Code Online (Sandbox Code Playgroud)

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

SET GLOBAL sql_mode='';
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,不要添加默认值,只需删除规则,很好的解决方案(暗示讽刺)永远不会成为一个很好的坏例子。它解决了这个问题 (2认同)
  • 是的,同意你的观点。但有时你有一些其他人的项目,该项目在生产中运行良好(未设置严格模式),而你只想添加一些小功能或错误修复,在本地工作。你不想与龙战斗,只是为了让那该死的东西发挥作用。:) (2认同)