Navicat 博客

MySQL 默认值:好还是坏? - 第1部分:严格的 SQL 模式 2020 年 5 月 22 日,由 Robert Gravelle 撰写

第1部分:严格的SQL模式

没有为不可为null列提供值时出现错误可能是造成挫败感的巨大根源。通过为这些列设置默认值,可以最大限度地减少此类错误的发生。似乎很容易解决,但就如所有事情,细节都是魔鬼。您必须注意不要仅为了使INSERT更加简单就向表中添加一堆通用的和无用的数据。在今天的博客中,我们将了解MySQL的严格SQL模式的后果,以及如何使用Navicat for MySQL 15来查看和设置它。在第2部分中,我们将介绍在什么情况下采用默认值(以及何时不采用)。

严格的SQL模式和调整后的值

在MySQL中,您可以通过打开严格SQL模式来控制MySQL如何处理数据更改语句(例如INSERT或UPDATE)中的无效值或缺失值。当要插入的新行不包含其定义中没有显式DEFAULT子句的不可为NULL列的值时,会出现缺少值。如果严格模式无效,MySQL会为无效或缺失值插入调整后的值并产生警告。调整值的示例包括一个空字符串,零和00:00:00 0000-00-00的时间戳/日期。

很明显,调整后的值可能会破坏默认值的整体作用。因此,通常最好激活严格的SQL模式并在适当的地方提供默认值。在Navicat中,您可以在服务器监控器的“变量”选项卡上检查SQL模式的当前值。您可以在主菜单中的“工具”>“服务器监控器”下找到它。

sql_mode_variable (119K)

如果存在STRICT_ALL_TABLES或STRICT_TRANS_TABLES,则严格SQL模式已启用。 在决定使用哪种格式时,请注意后者更为宽容,因为如果缺少值,MySQL会为列数据类型插入适当的调整值,并生成警告而不是错误。 而且,语句的处理继续进行。 同时,无效值被转换为最接近的有效值。

执行严格的SQL模式

让我们使用Sakila示例数据库将严格SQL模式与默认SQL模式进行比较。 actor表不允许任何列中为 null,如“不是 null”标题下的复选框所示:

actor_table_definition (62K)

如果我们使用SET命令为当前会话禁用严格SQL模式并执行仅提供last_name的INSERT,则数据库会接受它,但为first_name提供空字符串:

insert_statement (43K)

actor_with_missing_first_name (31K)

如果我们重新激活严格模式,则相同的INSERT现在会失败,并显示一条错误消息:

actor_with_missing_first_name_strict_mode (61K)

总结

在今天的博客中,我们了解了MySQL严格SQL模式的影响,以及如何使用 Navicat for MySQL 15进行查看和设置。在第二部分中,我们将介绍何时使用或不使用默认值。

Navicat 文章
频道条目
分享
文章归档