我的表格似乎是
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将看到这些异常(即使已经进行了插入),然后应用程序将崩溃。
答案 0 :(得分:187)
这是由
中定义的STRICT_TRANS_TABLES
SQL模式引起的
%PROGRAMDATA%\ MySQL \ MySQL Server 5.6 \ my.ini
文件。删除该设置并重新启动MySQL应该可以解决问题。
如果编辑该文件无法解决问题,请参阅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
您可以定义所需的模式,也可以将其留空。