关于数据库字段null 和 not null

更新时间:2023-10-10 12:07

null本身有他存在的意义。null可以理解为 ‘虚无’, 空 ‘’,是字段被赋予了一个空字符串值,这是一个实际的值。就好像瓶子中装满的空气~
必选项 设置为not null,不需要设置默认值

业务上null有意义,就要允许null,否则可以设默认值。
datetime可以为null,比如发货日期, mysql8默认值都不允许设置为`0000`了,只能设置为一个具体时间,比如发货时间,总不能1970年发货吧

如果一个字段是可选的,但是在大多数情况下都有一个常见的默认值,可以考虑设置一个默认值。
比如:状态: 0,1 对应关闭和开启。
登录次数:默认 0,登录次数总不能注册时添加0吧,设置默认值可以不影响正常注册新建表,同时null也是没有意义的,可以设置not null default 0

考虑到查询性能,有时将字段设置为NOT NULL 可能会更有利。这是因为在执行带有NULL值的字段的查询时,数据库需要额外的处理。但是,这个影响通常是微小的,只有在大型数据库上才会显著。

外键约束 如果字段用于建立外键关系,通常应将其设置为NOT NULL,并确保它引用了另一张表中存在的值。这有助于维护数据的引用完整性。

某些索引字段,索引字段原则上用not null,可以减少性能开销,但有些关联表

 $table->unsignedBigInteger('crm_client_id')->default(0)->comment('crm_clients表ID');
            $table->unsignedBigInteger('admin_dept_id')->default(0)->comment('admin_depts表ID');
            $table->unsignedBigInteger('crm_tag_id')->nullable()->comment('crm_tags 标签ID');

            $table->foreign('crm_client_id')
                ->references('id')
                ->on('crm_clients')
                ->cascadeOnDelete();

            $table->foreign('admin_dept_id')
                ->references('id')
                ->on('admin_depts')
                ->cascadeOnDelete();

            $table->foreign('crm_tag_id')
                ->references('id')
                ->on('crm_tags')
                ->cascadeOnDelete();

如上,索引表新增时增加2个not null 索引, 然后关联其他表时修改`crm_tag_id`字段,crm_tag_id字段只能设置为null,设置为0则报错,因为0关联不到crm_tags表的任何字段~



总结一下就是需要变通,必选not null。可选null,同时如果有常见默认值可以设置default,索引、关联字段尽量not null,不要全部字段死抱not null

以下Stack Overflow

您应该只在有理由时使用NOT NULL(例如,UI或后端关系需要的必填字段)。NOT NULL与NULL的性能差异可以忽略不计,根据2016年的这篇文章(SQL SERVER)的说法,在决定使用NOT NULL还是NULL时,性能不应该是一个考虑因素。

尽管该字段将默认为'N',但如果允许使用NULL,一条命令仍然可以将其设置为NULL。关键问题是NULL是否是该列的有效数据。

在数据驱动的技术应用中,根据我的经验,以下是一些我们使用的准则:

  • 对于数字字段,用户无法识别NULL,而且所有数字都具有含义。
  • 对于字符串字段,用户认为NULL和""(空字符串)是相同的,因此取决于您的后端应用程序。
  • 我知道您的问题排除了ISNULL检查,但如果您需要频繁进行此类检查,那么这可能表明这些字段应尽可能设置为NOT NULL,因为它们可能会变得昂贵。

这些准则有助于确定何时使用NOT NULL和NULL,以及何时进行ISNULL检查。它们可以帮助您更好地设计数据库模式和应用程序逻辑,以满足业务需求并优化性能。




https://stackoverflow.com/questions/48094960/null-vs-not-null-performance-differences

https://b23.tv/5Dd7aGK   不要看视频,看评论区…