【问题标题】:mysql error 1364 Field doesn't have a default valuesmysql错误1364字段没有默认值
【发布时间】:2013-03-04 13:08:12
【问题描述】:

我的桌子看起来像

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

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

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

    【讨论】:

    • 您可以在数据库管理工具中运行 SQL 查询,例如 phpMyAdmin:-- verified that the mode was previously set select @@GLOBAL.sql_mode; -- UPDATE MODE SET @@global.sql_mode= 'YOUR_VALUE';
    • 但也许你想要 STRICT_TRANS_TABLES ?
    • 在我的情况下,该字段的类型为 DATETIME,默认设置为 NULL,但我仍然看到相同的错误,我在同一个数据库上有两个架构。一个用于暂存,另一个用于生产,具有相同的表结构。它适用于一种模式,但不适用于两种模式中完全相同的表结构的另一种模式。我很困惑..我不确定这是 STRICT_TRANS_TABLES 的问题
    • 我从 /etc/my.cnf 中删除了 STRICT_TRANS_TABLES - 在以 sql_mode 开头的行中 - 并重新启动了 mysql 服务,问题就消失了。
    【解决方案2】:

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

    【讨论】:

    • 这个问题是关于 MySQL 的,没有提到 phpmyadmin。请不要假设每个人都在运行。
    • @jackadams49 这种变化不会持续。你能告诉我你做了什么让这个改变在系统重启后仍然存在吗?
    • @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",保存退出,重启mysqlsudo service mysql restart
    • 补充一点,我必须将sql_mode的值更改为null,即sql_mode = ""以防其他类似错误。
    • 我们最近将 MySQL 升级到了 5.7。我们面临的问题太多了。这对我有用。拯救了我的一天。
    【解决方案3】:

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

    【讨论】:

    • 是的,但为此您需要使用 root 帐户登录 phpmyadmin :) 超级帐户
    • 花了四个小时后,这个解决方案在 Ubuntu 16.04 中为我工作。太好了!
    • 你根本不需要phpmyadmin,在mysql命令行上使用这些命令。
    • 这将在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'
    • @waza123 的解决方案,这个在升级到 mysql 5.7.20 后对我有用。谢谢
    【解决方案4】:

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

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

    【讨论】:

    • 如何在Java程序中设置默认值?
    • 你需要在表的定义中有一个默认值(create table try (name varchar(8), CREATED_BY varchar(40) DEFAULT '' not null))
    • 这并没有解决根本问题。请参阅下面 Phyxx 提供的更广泛的答案。
    • @csvan Phyxx 的答案也没有解决根本原因,因为根本原因是 MySQL 中的一个错误,该错误已在 v5.7.1 中修复 - 请参阅 B98 的答案:stackoverflow.com/a/29854279/5389997 删除 strict_trans_table sql 模式会使MySQL 更容易出现数据质量错误,因此删除它并不是一个很好的建议。
    • @cazort 如果所有这些警告都包含在那个答案中,我什至可能同意你的看法。这些没有添加,所以答案是完全危险的。
    【解决方案5】:

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

    错误消失了!

    【讨论】:

      【解决方案6】:

      运行mysql控制台:

      mysql -u your_username -p
      

      ,选择数据库:

      USE your_database;
      

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

      SET GLOBAL sql_mode='';
      

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

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

      【讨论】:

      • 是的,不要添加默认值,只需删除规则,很好的解决方案(暗示讽刺)永远不会这样做是一个很好的坏例子。它解决了这个问题
      • 是的,同意你的看法。但有时你有一些其他人的项目,它运行良好,即在生产中(未设置严格模式),你只想添加一些小功能或错误修复,在本地工作。你不想和巨龙战斗,只是为了让那件事情发挥作用。 :)
      • 我同意这种情况
      • @zardilior 有什么问题?如果删除规则,则根据列类型选择默认值。我认为它没有任何问题:/该规则无缘无故地非常苛刻。
      • 一点也不苛刻,它只是强制你声明一个默认值或提供一个值,严格模式也适用于更多的事情,所以禁用它,而不是在列上声明一个默认值或传递价值,真是太可怕了。你在那里禁用了 mysql 的一个好的特性
      【解决方案7】:

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

      检查STRICT_TRANS_TABLES模式是否开启:

      SHOW VARIABLES LIKE 'sql_mode';
      

      要禁用严格模式:

      SET GLOBAL sql_mode='';
      

      【讨论】:

      • 手动从变量中删除“STRICT_TRANS_TABLES” > 用于测试的 sql_mode 并且有效!
      • 你拯救了我的一天。
      • 对我来说,在运行第二个命令并检查 sql_mode(第一个命令)后它什么也没做。即使重新启动mysql服务。 Debian 9
      【解决方案8】:

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

      SET SQL_MODE = '';
      

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

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

      【讨论】:

      • 在每次插入操作之前不需要这样做,只需在脚本开始时执行一次,就在连接到数据库之后,并且每个插入查询都可以在没有“字段不”的情况下工作t 有默认值”错误。
      • 这个解决方案很好,因为您不需要更改表(可能有很多字段要更改)。
      【解决方案9】:

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

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

      然后重启 MySQL

      【讨论】:

        【解决方案10】:

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

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

        【讨论】:

        • 这对我有用 - 我的 PHP 脚本会中止,但使用 IGNORE,它只会显示新行!现在,将 IGNORE 硬编码到 PHP-MYSQL 查询中有多“安全”?我用它来为新的“天”自动添加行,它以前不存在
        • @Levchik 当您使用 IGNORE 时,MySQL 会在发生错误时发出警告而不是错误,而是会尝试以某种方式完成指令:mysqltutorial.org/mysql-insert-ignore
        • 工作就像一个魅力!你拯救了我的一天~非常感谢
        【解决方案11】:

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

        不为 NOT NULL 列处理触发器

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

        【讨论】:

        • 我从 5.6 升级到 5.7.11 并且问题对我来说已解决(并且删除 STRICT_TRANS_TABLES 对我不起作用),所以我赞成这个并反对其余的答案
        • @knocte 不是每个人都可以在他的系统上升级 MySQL,所以不值得反对。
        • 唯一真正帮助我的答案。删除NOT NULL 约束或将默认值添加到列修复了问题。触发器按预期工作。
        【解决方案12】:

        对于 Windows WampServer 用户:

        WAMP > MySQL > my.ini

        在文件中搜索sql-mode=""

        取消注释。

        【讨论】:

        • 在我的版本中,我不得不更改:sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"sql-mode=""。取消注释 sql-mode="" 导致错误。
        【解决方案13】:

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

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

        【讨论】:

        • 这个答案是一样的。 stackoverflow.com/a/52004654/10431118
        • 一般来说是的,但我的意思是,我要特别说明的是不要清除 sql-mode 的所有值,而是只删除 STRICT_TRANS_TABLES,因为这就是你所需要的。否则您可能会影响其他一些服务。
        【解决方案14】:

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

        【讨论】:

        • 它通过将列的default 属性从none 更改为NULL 解决了我的错误。除非得到高评价的答案!当我尝试更新变量 sql_mode 时,我的 cPanel 拒绝访问共享主机。
        【解决方案15】:

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

        【讨论】:

          【解决方案16】:

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

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

          【讨论】:

            【解决方案17】:

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

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

            【讨论】:

              【解决方案18】:

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

              【讨论】:

                【解决方案19】:

                这是为 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%”;


                【讨论】:

                  猜你喜欢
                  • 2013-09-16
                  • 2019-11-23
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-02-28
                  • 2021-10-13
                  • 2017-03-02
                  • 2020-02-03
                  相关资源
                  最近更新 更多