Mysql 错误1364 Field 没有默认值

我的桌子看起来像

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

然后我有一个触发器来自动填充 CREATION _ 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

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

535723 次浏览

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

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

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

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

错误消失!

打开 phpmyadmin,转到‘ More’标签页,选择‘ Variables’子菜单。 向下滚动查找 sql 模式。 编辑 sql 模式并删除“ STRICT _ TRANS _ TABLES” 省省吧。

这似乎是由一个 长期存在(自2004年以来) 漏洞(# 6295),题为

不处理 NOTNULL 列 的触发器。

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

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

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

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

然后重启 MySQL

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

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

SET SQL_MODE = '';

我不确定这是不是最好的解决办法,

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

对于 WindowsWampServer用户:

WAMP > MySQL > my.ini

搜索 sql-mode=""文件

取消评论。

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

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

运行 mysql 控制台:

mysql -u your_username -p

,选择数据库:

USE your_database;

然后运行(也从 mysql 控制台) :

SET GLOBAL sql_mode='';

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

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

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

检查是否启用 STRICT_TRANS_TABLES模式:

SHOW VARIABLES LIKE 'sql_mode';

禁用严格模式:

SET GLOBAL sql_mode='';

在 Windows Server 中编辑 my.ini (例如程序文件 mysql mysql Server n.n my.ini)

我不会简单地设置 sql-mode = “”,而是建议从这行中删除 STRICT _ TRANS _ TABLES,保持所有内容不变,然后从 services 实用程序重新启动 MySQL。为未来的程序员添加注释,告诉他们你是谁,你做了什么。

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

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

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

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

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

我发现,一旦我删除了外键和主键的合并,那么我就可以只使用外键作为表中的主键。我所有的代码,然后工作,我能够上传到数据库。

这是针对 SYNOLOGY 设备用户的:


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

用腻子连接:
登入
在... 之后的 sudo su (作为管理总数)

  • 如果不存在,则在:

MariaDB 5:
/var/package/MariaDB/etc
MariaDB 10:
/var/package/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 < br >

  • 输入密码:

显示类似‘ sql _ mode’的变量;
显示“% STRICT%”等变量;


这些问题的答案大部分对于没有经验的编码人员来说是一项繁重的工作,就像前面提到的 STRICT _ TRANS _ TABLES 的问题一样。

首先确认 STRICT_TRANS_TABLES正在运行。

$mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"

通过在 Linode 的命令行上运行以下命令,可以禁用 MySQL 服务器上的严格模式:

$mysql -u root -p -e "SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';"

然后,您可以通过运行以下命令来验证模式是否已设置:

$mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"

这个答案就是在这里找到的