本文作者:kris

为什么mysql字段要使用NOT NULL-

kris 2025-01-22 15:24:05 2
为什么mysql字段要使用NOT NULL-摘要: oracle中sql语句怎么将字段的值更新为null?update table1 set cilumn_name = null where column_name2 = ..; c...

oracle中sql语句怎么将字段的值更新为null?

update table1 set cilumn_name = null where column_name2 = ..; commit; sql 语句是对数据库进行操作的一种语言。

结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

Mysql的字段设置为null有什么优点呢?

NULL是创建数据表时默认的,初级或不知情的或怕麻烦的程序员不会注意这点。

如果把字段设置成允许null那么在查询语句中mysql难以优化,而且它会使索性、索引统计和值更加复杂。

另外,可空列需要更多的存储空间。

1. 问题描述

Mysql的字段设置为null有什么优点呢?

问题结论

网上随便找了找,没有发现什么优点,缺点倒是一大堆。在实践过程中,默认为null最大的优点应该算是方便吧,一些非核心字段默认为空,前端用的时候判断为null时不展示,或者为null时将其设置为默认的字段值。

2. 简述Mysql的字段设置为null的缺点

2.1 查询条件中有null列需要格外注意,容易出错。

  • mysql中,任何值和null的比较,都返回null,而不是true或者false。

为什么mysql字段要使用NOT NULL-

  • 包括null=null结果都是null,不是true。

为什么mysql字段要使用NOT NULL-

所以一旦在查询条件使用了null,而不是使用is null或者is not null将出现错误。不会返回任何值。由于mysql中,null值和任何值的比较,都会返回null,导致条件中有null的时候,返回结果和想想中的可能就不一样了。

2.2 部分函数入参有null的时候,返回值是null。

  • contact()方法,如果入参有null,返回是null。

为什么mysql字段要使用NOT NULL-

2.3 Null列需要更多的存储空间:需要一个额外字节作为判断是否为NULL的标志位。

  • table1和table3是一模一样的,唯一不同的就是user_name字段,table1是not null,而table3的user_name没有not null的约束。

为什么mysql字段要使用NOT NULL-

为什么mysql字段要使用NOT NULL-

2.4 Explain输出的key_len的计算规则和三个因素有关:数据类型、字符编码、是否为 NULL。

Utf8mb4编码是4字节,utf8是3字节

  • not null的字段

key_len=索引字段占用的字节数+2字节可变长字段长度(定长类型不需要)

如编码集=utf8mb6的varchar(20),ken_len=82

62=20*4 +2

  • 允许为null字段

key_len=索引字段占用的字节数+2字节可变长字段长度(定长类型不需要)+1(存储是否为null的标识)

如编码集=utf8mb6的varchar(20),ken_len=83

83=20*4+2+1

所以说索引字段最好不要为NULL,因为NULL会使索引、索引统计和值更加复杂,并且需要额外一个字节的存储空间。

作者:夕阳雨晴,欢迎关注我的头条号:偶尔美文,主流Java,为你讲述不一样的码农生活。

现在的计算机语言中普遍采用了三值逻辑。也就是真、假、空三值。空代表非真非假的不确定状态。三值逻辑为空设置了这样的真值表:

  • NOT NULL IS NULL
  • TRUE AND NULL IS NULL
  • FALSE AND NULL == FALSE
  • NULL AND NULL IS NULL
  • TRUE OR NULL == TRUE
  • FALSE OR NULL IS NULL
  • NULL OR NULL IS NULL
  • X==NULL IS NULL

数据库中使用NULL可以处理更丰富的条件。比如,学生的成绩存在三种状态:及格、不及格、旷考。使用NULL就可以在一个字段中体现出来。

对存在NULL值的字段检索时,要注意使用上面的真值表,特别是不能用"X=NULL"或者"X!=NULL"做判断,因为这两个判断都不为真。正确的做法是“X IS NULL"。另外,EXISTS和IN对NULL的判断也是不一样的,建议自己去试试。很多书上不建议使用NULL,这主要是因为NULL的特殊性质,使得它无法参与排序,因此,无法对包含NULL的字段建立索引,容易引起FULLSCAN降低查询效率。

数据库中引入NULL,是为了确保SQL语言逻辑的完备性。如果没有NULL,有些逻辑是不能完美实现的。很多人觉得没有必要搞三值,用两个真假就可以代替了。事实上,这种做法无意中引入了四个值,多出来的一个值容易引起逻辑混乱,产生BUG。

索引列可以为null吗?

在大多数数据库管理系统中,索引列通常不允许为NULL。索引的目的是提高查询性能,通过快速定位到特定的数据行。如果索引列允许为NULL,那么在查询时就需要额外的处理逻辑来处理NULL值,这会降低查询性能。因此,为了保持索引的有效性和性能,索引列通常不允许为NULL。

Oracle 唯一索引列允许为null吗?

Oracle 的唯一索引列是否允许为null,取决于创建唯一索引时是否指定了NULLS ALLOWED或NOT NULLS参数:

1. 指定NULLS ALLOWED:

允许唯一索引列为null值。此时如果存在多个行的索引列都为null,不会违反唯一性约束。

语法:

sql

CREATE UNIQUE INDEX 索引名

ON 表名 (索引列名) NULLS ALLOWED;

2. 指定NOT NULL或没有指定NULL属性:

不允许唯一索引列为null值。此时唯一索引列中只能包含一个null值,会违反唯一性要求。

语法:

sql

CREATE UNIQUE INDEX 索引名

ON 表名 (索引列名) NOT NULL;

文章版权及转载声明

作者:kris本文地址:https://www.damoyx.com/p/26127.html发布于 2025-01-22 15:24:05
文章转载或复制请以超链接形式并注明出处大漠游侠网

阅读
分享