133

我的桌子看起来像

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

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

4

19 回答 19

221

这是由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了解配置文件的其他可能位置。

于 2013-05-29T05:11:46.293 回答
95

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

于 2014-10-19T15:41:43.187 回答
45

在 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'
于 2016-08-26T07:43:00.603 回答
37

Created_By为(例如:空)设置默认值,VARCHAR触发器无论如何都会更新该值。

create table try ( 
     name varchar(8), 
     CREATED_BY varchar(40) DEFAULT '' not null
);
于 2013-03-15T17:47:34.647 回答
31

当我在使用 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

错误消失了!

于 2014-09-15T13:37:59.980 回答
23

运行 mysql 控制台:

mysql -u your_username -p

,选择数据库:

USE your_database;

并运行(也从 mysql 控制台):

SET GLOBAL sql_mode='';

这将关闭严格模式,mysql 不会再抱怨了。

为了清楚起见:您的数据库定义说“这个字段必须定义默认值”,并且通过执行上面的步骤,您对 MySql 说“好吧,忽略它”。因此,如果您只想在本地进行一些快速修复,这个解决方案是可以的。但通常你应该调查你的数据库定义并检查字段是否真的需要默认值,如果需要设置它。如果不需要默认值,则应删除此要求以保持干净的情况。

于 2018-08-17T08:22:17.177 回答
15

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

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

SHOW VARIABLES LIKE 'sql_mode';

要禁用严格模式:

SET GLOBAL sql_mode='';
于 2018-08-24T12:35:35.197 回答
14

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

SET SQL_MODE = '';

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

SET SQL_MODE = ''; INSERT INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');
于 2017-03-22T17:12:31.370 回答
13

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

INSERT IGNORE INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');
于 2018-02-15T09:05:36.393 回答
12

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

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

然后重启 MySQL

于 2016-08-30T07:44:49.493 回答
6

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

不为 NOT NULL 列处理触发器

据称,它在 2013 年的 MySQL 5.7.1 版本(变更日志,最后一个条目)中得到修复,使 MySQL 的行为符合“SQL 标准”(同上)。

于 2015-04-24T17:52:37.987 回答
6

对于 Windows WampServer用户:

WAMP > MySQL > my.ini

搜索文件sql-mode=""

取消注释它。

于 2017-04-21T16:23:26.377 回答
3

在 Windows Server 中编辑 my.ini(例如 program files\mysql\mysql server nn\my.ini)

我不会简单地设置 sql-mode="",而是建议从该行中删除 STRICT_TRANS_TABLES,让所有内容保持原样,然后从服务实用程序重新启动 MySQL。为您是谁以及您所做的未来程序员添加评论。

于 2018-12-03T18:14:05.613 回答
1

我将字段设置为不为空并解决了问题,当命令将信息存储在其中时它会更新,不再显示字段为空的 msqli 消息,因为您没有向它插入值,这个解决方案的应用程序可以在一些项目取决于您的项目结构。

于 2016-11-25T01:34:21.703 回答
0

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

于 2019-06-02T09:58:18.090 回答
0

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

update try set name='abc' where created_by='def';
  
于 2020-06-25T05:56:51.077 回答
0

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

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

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

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

于 2021-06-17T19:05:29.597 回答
0

我发现一旦我删除了外键和主键的加倍,当我可以只使用外键作为表中的主键时。然后我的所有代码都可以正常工作,并且我能够上传到数据库。

于 2021-11-21T10:34:37.460 回答
0

这适用于 SYNOLOGY 设备用户:


  • 如何在 SYNOLOGY 设备上设置全局变量(严格模式关闭)。
    (检查 DSM 7.0.1-42218 - 设备型号 DS418)

使用 PUTTY 连接:以root
身份登录和sudo su后...(总管理员)

  • 如果不存在,则在以下位置创建my.cnf

MariaDB 5:
/var/packages/MariaDB/etc
MariaDB 10:
/var/packages/MariaDB10/etc

  • 这应该在文件中(至少对于严格模式关闭)
# custom configs
[mysqld]
innodb_strict_mode = OFF
sql_mode = ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  • 重启 mysqld 守护进程:
    MariaDB 5:
    /usr/syno/bin/synopkg 重启 MariaDB
    MariaDB 10:
    /usr/syno/bin/synopkg 重启 MariaDB10

  • 检查在这两个全局选项中启用的严格模式 - 两者都不应该存在或关闭(参见上面的配置)

  • 登录mysql:
    mysql -u root -p

  • 输入密码:

显示像'sql_mode'这样的变量;
显示变量,如“%STRICT%”;


于 2022-01-09T06:32:25.597 回答