我有一个 Mariadb 10.2.26 服务器,禁用了“STRICT_TRANS_TABLES”模式。唯一启用的模式是“NO_ENGINE_SUBSTITUTION”。但即使这样,我也收到“一般错误:1364 字段''没有默认值”。有谁知道为什么?谢谢。
1 回答
这是多年来所做的“不兼容更改”的一小部分示例。
----- 2014-09-25 5.7.5 里程碑 15 -- SQL 模式注意事项 -- 不兼容更改 -----
进行了以下 SQL 模式更改:
Strict SQL mode for transactional storage engines ([STRICT_TRANS_TABLES](http://dev.mysql.comhttps://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_strict_trans_tables))
现在默认启用。
Implementation of the [ONLY_FULL_GROUP_BY](http://dev.mysql.comhttps://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by)
SQL 模式变得更加复杂,不再拒绝以前被拒绝的确定性查询。
MySQL now recognizes when a nonaggregated selected column is functionally dependent on (uniquely determined by) GROUP BY columns. MySQL has an extension to standard SQL that permits references in the HAVING clause to aliased expressions in the select list.
以前,启用 ONLY_FULL_GROUP_BY 会禁用此扩展,因此需要使用非别名表达式编写 HAVING 子句。此限制已取消,因此无论是否启用了 ONLY_FULL_GROUP_BY ,HAVING 子句都可以引用别名 。
In consequence, [ONLY_FULL_GROUP_BY](http://dev.mysql.comhttps://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by)
现在默认启用,以禁止包含不保证在组内唯一确定的表达式的非确定性查询。
The changes to the default SQL mode result in a default [sql_mode](http://dev.mysql.comhttps://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_sql_mode)
启用这些模式的系统变量值: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ENGINE_SUBSTITUTION。
The [ONLY_FULL_GROUP_BY](http://dev.mysql.comhttps://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by)
模式现在包含在 ANSI SQL 模式所包含的模式中。
A new function, ANY_VALUE(), is available that can be used to force MySQL to accept queries that it thinks should be rejected with
ONLY_FULL_GROUP_BY 已 启用。函数返回值和类型与其参数的返回值和类型相同,但对于 ONLY_FULL_GROUP_BY SQL 模式不检查函数结果。
如果您发现 启用ONLY_FULL_GROUP_BY 会导致对现有应用程序的查询被拒绝,则这些操作中的任何一个都应该恢复操作:
If it is possible to modify an offending query, do so, either so that nondeterministic nonaggregated columns are functionally dependent
在 GROUP BY 列上,或通过使用 ANY_VALUE()引用非聚合列。
If it is not possible to modify an offending query (for example, if it is generated by a third-party application), set the sql_mode
服务器启动时的系统变量不启用 ONLY_FULL_GROUP_BY。
有关 SQL 模式和 GROUP BY 查询的更多信息,请参阅服务器 SQL 模式和MySQL 处理 GROUP BY。(错误号 18486310)
----- 2014-03-31 5.7.4 里程碑 14 -- 添加或更改功能 -- 不兼容的更改 -----
已弃用的 ERROR_FOR_DIVISION_BY_ZERO、 NO_ZERO_DATE和 NO_ZERO_IN_DATE SQL 模式现在什么都不做。相反,它们之前的效果包含在严格 SQL 模式(STRICT_ALL_TABLES 或 STRICT_TRANS_TABLES)的效果中。换句话说,严格模式现在的含义与之前严格模式的含义相同,加上 ERROR_FOR_DIVISION_BY_ZERO、 NO_ZERO_DATE和 NO_ZERO_IN_DATE 模式。此更改减少了依赖于严格模式的 SQL 模式的数量,并使它们成为严格模式本身的一部分。
为了准备此版本 MySQL 中的 SQL 模式更改,建议在升级之前阅读MySQL 5.7 中的 SQL 模式更改。该讨论提供了评估您的应用程序是否会受到这些更改影响的指南。
已弃用的 ERROR_FOR_DIVISION_BY_ZERO、 NO_ZERO_DATE和 NO_ZERO_IN_DATE SQL 模式仍然可以识别,因此命名它们的语句不会产生错误,但将在 MySQL 的未来版本中删除。为了提前准备不存在这些模式的 MySQL 版本,应修改应用程序以不引用这些模式名称。
----- 2014-03-27 5.6.17 一般可用性 -- SQL 模式注释 -- 不兼容更改 -----
现在 不推荐使用ERROR_FOR_DIVISION_BY_ZERO、 NO_ZERO_DATE和 NO_ZERO_IN_DATE SQL 模式,并且将 sql_mode 值设置为包含它们中的任何一个都会产生警告。在 MySQL 5.7 中,这些模式什么都不做。相反,它们的影响包含在严格 SQL 模式(STRICT_ALL_TABLES 或 STRICT_TRANS_TABLES)的影响中。MySQL 5.7 更改的动机是减少影响依赖于严格模式的 SQL 模式的数量,并使它们成为严格模式本身的一部分。
要提前准备升级到 MySQL 5.7,请参阅 MySQL 5.7 中的SQL 模式更改。该讨论提供了评估您的应用程序是否会受到 MySQL 5.7 中 SQL 模式更改的影响的指南。
----- 2013-02-05 5.6.10 通用可用性 -- 已修复的错误 -- InnoDB -----
在联机 DDL 操作期间,将列从可为 null 更改为 NOT NULL 可能会成功或失败,具体取决于ALTER TABLE 语句是使用 ALGORITHM=INPLACE 还是 ALGORITHM=COPY。即使列包含 NULL 值,具有 ALGORITHM=COPY 的操作也会成功,而具有 ALGORITHM=INPLACE 的操作会失败,因为该列可能包含 NULL 值。现在,允许将列 NOT NULL 与 ALGORITHM=INPLACE 子句结合使用,但前提是 sql_mode 配置选项包括 STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES 设置。如果没有使用ALTER TABLE指定 ALGORITHM 子句 如果可能,在线 DDL 操作将使用 ALGORITHM=INPLACE,否则将使用 ALGORITHM=COPY。(错误 #15961327)
----- 2012-11-07 5.6.8 候选版本 -- 安装说明 -- -----
在 Unix 平台上,mysql_install_db 现在在基本安装目录中创建一个名为 my.cnf 的默认选项文件。该文件是根据包含在名为 my-default.cnf 的分发包中的模板创建的。您可以在基本安装目录中或下找到该模板。开始使用 mysqld_safe 时,服务器默认使用 my.cnf 文件。如果 my.cnf 已经存在,则 mysql_install_db 假定它正在使用中,并改为写入一个名为 my-new.cnf 的新文件。
除了一个例外,默认选项文件中的设置被注释并且无效。例外情况是该文件将 sql_mode 系统变量从其默认值 NO_ENGINE_SUBSTITUTION 更改 为还包括 STRICT_TRANS_TABLES:
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
此设置生成的服务器配置会导致错误,而不是针对修改事务表的操作中的错误数据发出警告。请参阅服务器 SQL 模式。
my-default.cnf 模板替换了不再分发的旧样本选项文件(my-small.cnf、my-medium.cnf 等)。
----- 2004-12-01 5.0.2 -- 添加或更改功能 -- -----
添加 了STRICT_TRANS_TABLES、 STRICT_ALL_TABLES、 NO_ZERO_IN_DATE、 NO_ZERO_DATE、 ERROR_FOR_DIVISION_BY_ZERO和 TRADITIONAL SQL 模式。TRADITIONAL 模式是所有前述模式的简写。 使用模式 TRADITIONAL时,如果您尝试在列中插入错误的值,MySQL 会生成错误。它不会将该值调整为最接近的可能合法值。
----- 2004-12-01 5.0.2 -- 添加或更改功能 -- -----
删除了编译标志 DONT_USE_DEFAULT_FIELDS ,因为您可以通过将 sql_mode 系统变量设置为 STRICT_TRANS_TABLES来获得相同的行为。
----- 2004-12-01 5.0.2 -- 添加或更改功能 -- -----
MySQL 现在记住哪些列被声明为具有默认值。在 STRICT_TRANS_TABLES / STRICT_ALL_TABLES模式下,如果您在 未指定所有没有默认值的列的情况下执行INSERT ,您现在会收到错误 消息。这样做的副作用是,当您为新表执行 SHOW CREATE 时,您不再看到未指定默认值的列的默认值。