“必要约束”和“非必要约束”——我的猜测
之前我说错了一个点,我错误地认为需要把"NULL / NOT NULL"约束归结于数据类型中,后来又想了一想,并与韩老师交流了一番后,得出结论:"NULL / NOT NULL"是约束,不是数据类型!虽然很疑惑,但是必须接受这个事实,经过一番推敲之后便写下了此文。本文重点介绍了“必要约束”和“非必要约束”。
数据类型是什么,它的出现是干什么用的 ===》
数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。
所以"NULL / NOT NULL"就不能归属于数据类型,因为不管加不加它,系统都只会依据之前定义的数据类型去分配空间,它只是起到检查字段的值是否为空的作用,属于约束。
那么为什么"NULL / NOT NULL"约束和其他的约束不同呢?
韩老师认为:
(1). 可能是因为"NULL / NOT NULL"约束不好建立索引,所以没有出现在sysconstraint(系统约束对象表)中;
(2). 至于为什么必须跟在数据类型的后面,大概是因为每一个数据类型都能加上,所以如果单单使用"NULL / NOT NULL"约束的话并不能区分到底是哪一个数据类型的;
所以我觉得这个"NULL / NOT NULL"约束更像是在约束数据类型而不仅仅是字段(数据类型约束字段,"NULL / NOT NULL"约束约束数据类型),就是说数据类型是否可以加上空集{φ}:NULL——可以加上{φ}; NOT NULL——不可以加上{φ}。
数据类型何尝不是一种约束?===》
数据类型是将全部的数据依照其共有的特点,划分成很多个不同的区域。那么这里的区域不也可以成为一个约束嘛?比如说,我在某个字段FIELD上定义了该字段的数据类型为DATA_TPYE,所以其他的数据类型的值该字段均不接收,只能接收数据类型为DATA_TYPE的值,那么这不就相当于起来一个约束作用了嘛,或者说是一个filter(过滤器)?
提到约束,这里就要谈一谈什么是约束 ===》
在此首先说一些大前提:约束是普遍存在的,一切事物皆有约束,并且这里的约束范围很广,以至于只要限制了范围都能称得上是一个约束,比如一个简简单单的定义:非零的自然数是正整数。
一个实体被创建后,它便具有了很多属性,每一个属性"与生俱来"都有一个域与之对应,当然这个域并不是一成不变的,它是可以改变的,但是它必须存在。如果一个属性没有域与之对应(空集{φ}也是一种域),那么这个属性也就没有了意义。
属性的一个域是可以分成很多个小域的,就比如说成绩,我们可以规定它的数据类型为int(第一个小域)、他可以取的空值代表在读学生没有参加考试(第二个小域)、我们规定满分为100分,那么成绩的取值范围就是[0, 100](第三个小域)。
根据之前所学的笛卡尔积可以尝试对某个属性的域下一个定义:D1, D2, ..., Dn, ...这样可能是无限多个小域的笛卡尔积组成了属性的整个域,但是我们仅仅取出其中的一个元组来代表该字段的约束,也就是该属性的域。
在属性的域(同字段的约束)中一共有两种(这当然是我猜测的):自然约束和人为约束,也称必要约束和非必要约束。
必要约束(自然约束)指的是:必须选择该小域中的一个值作为对该字段的约束;
非必要约束(人为约束)指的是:可以放弃对该小域的选择,直接将整个小域作为该字段的约束;
SQL认为(实际上是根据SQL的某些语法,我猜测)数据类型和"NULL / NOT NULL"约束是必要约束,其他的六大约束是非必要约束。
如果你纠结于为什么(你所认为的)"NOT NULL"约束为什么是自然约束而不是人为约束,你给出的理由是:我也可以选择"NOT NULL"也可以不选择,如果选择的话就不为空,否则就是可以为空。那么想必你已经混淆了一个事实:你认为的那个约束的真名是"NULL / NOT NULL"约束。是必须在"NULL"和"NOT NULL"中选择一个,至于选择NULL还是NOT NULL当然是由人来决定的。
所以在SQL中只能修改数据类型和"NULL / NOT NULL"约束,而不能想其他非必要约束一样,为了避免旧约束与新约束发生冲突而作出先删除旧约束,再创建新约束的行为。

浙公网安备 33010602011771号