关于数据库字段null 和 not null
null本身有他存在的意义。null可以理解为 ‘虚无’, 空 ‘’,是字段被赋予了一个空字符串值,这是一个实际的值。就好像瓶子中装满的空气~
必选项 设置为not null,不需要设置默认值
datetime可以为null,比如发货日期, mysql8默认值都不允许设置为`0000`了,只能设置为一个具体时间,比如发货时间,总不能1970年发货吧
如果一个字段是可选的,但是在大多数情况下都有一个常见的默认值,可以考虑设置一个默认值。
比如:状态: 0,1 对应关闭和开启。
登录次数:默认 0,登录次数总不能注册时添加0吧,设置默认值可以不影响正常注册新建表,同时null也是没有意义的,可以设置not null default 0
考虑到查询性能,有时将字段设置为NOT NULL 可能会更有利。这是因为在执行带有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 不要看视频,看评论区…
更新时间:2024-12-18 20:26