Reg*_*ser 40 sql database ms-access database-design
哪些优点和缺点使用NULL值,而不是在SQL 默认值?
PS.这里已经提出了许多类似的问题,但没有人回答我的问题.
R v*_*ijn 40
数据库中的NULL值是占用一个存储字节的系统值,表示不存在值而不是空格或零或任何其他默认值.包含NULL值的数据库中的字段表示此单元格的内容在查看时未知.允许NULL值的列还允许插入行,该列中根本没有值.使用NULL值而不是默认值有几个优点和缺点:
优点
NULL值没有数据类型,因此可以插入任何数据结构和任何数据库列.另一方面,默认值需要指定其数据类型,并且一列中的默认值在另一列中看起来可能相同,但它可能是不同的类型.
NULL通常用于模式中,其中值是可选的.这是一种省略未知字段数据输入的便捷方法,而无需实现其他规则,例如在整数字段中存储负值以表示省略的数据.
由于NULL值仅占用1位内存空间,因此在优化数据库时它们可能很有用.使用这些值比默认值更有效,例如字符的8位和整数的16位.
虽然您的系统要求可能会随着时间的推移而发生变化,并且默认值类型也随之改变,但NULL值始终为NULL,因此无需更新数据类型.
在表格模式中分配Not Null也可以帮助进行表格验证,因为具有Not Null条件的列将需要插入值.默认值没有这些功能.
缺点
NULL值很容易与空字符串混淆,空字符串在选中时会向用户返回空值.从这个意义上讲,默认值不那么容易混淆,并且是更安全的选项,除非将默认值设置为空字符串.
如果数据库中允许使用NULL值,它们可能会使设计人员有一些额外的时间和工作,因为它们会使数据库逻辑变得更复杂,尤其是当存在大量与空值的比较时.
来源:赞成和缺点
Cro*_*zin 18
我不知道为什么你甚至试图将这些与案例进行比较.null
表示某些列为空/没有值,而当我们不在查询中直接设置时,默认值会为列提供一些值.
也许一些例子将是更好的解释.假设我们已经摆好member
桌子了.每个成员都有一个ID和用户名.可选他可能有一个电子邮件地址(但他没有).此外,每个成员都有一个postCount列(每次用户编写帖子时都会增加).因此,电子邮件列可以具有null
值(因为电子邮件是可选的),而postCount列NOT NULL
具有默认值0
(因为当我们创建新成员时,他没有任何帖子).
Phi*_*ier 11
空值不是......值!
Null意味着"没有价值"......除了数据库方面,非值变量或字段的一个重要维度是在比较变量时不可能使用'='(或'>','<').
写一些像(VB):
if myFirstValue = mySecondValue
Run Code Online (Sandbox Code Playgroud)
如果一个或两个变量都是非值,则不会返回True或False.您将不得不使用"周转",例如:
if (isnull(myFirstValue) and isNull(mySecondValue)) or myFirstValue = mySecondValue
Run Code Online (Sandbox Code Playgroud)
在这种情况下使用的"通常"代码是
if Nz(myFirstValue) = Nz(mySecondValue, defaultValue)
Run Code Online (Sandbox Code Playgroud)
不严格正确,因为非值变量将被视为与'defaultValue'值(通常为零长度字符串)"相等".
尽管存在这种令人不快的行为,但永远不要永远不要将默认值打开到零长度字符串(或"0")而没有有价值的理由,并且在代码中简化值比较并不是一个有价值的理由.
这取决于具体情况,但最终真的很简单。哪一个更接近真相?
很多人处理数据就好像它只是数据一样,而事实并不重要。但是,每当您与数据中的利益相关者交谈时,您都会发现事实总是很重要。有时更多,有时更少,但它总是很重要。
当您假定如果用户(或其他数据源)提供了一个值,则该值将是默认值时,默认值很有用。如果这个假设弊大于利,那么 NULL 更好,即使处理 NULL 在 SQL 中是一种痛苦。
请注意,可以通过三种不同的方式实现默认值。首先,在应用程序中,插入新数据之前。数据库永远不会看到用户提供的默认值与应用程序提供的默认值之间的区别!
其次,通过声明列的默认值,并在插入中留下缺失的数据。
第三,通过在检索时替换默认值,只要检测到 NULL。只有少数 DBMS 产品允许在数据库中声明这第三种模式。
在理想的世界中,数据永远不会丢失。如果您正在为现实世界进行开发,则最终会丢失所需的数据。您的应用程序可以做一些有意义的事情,也可以在发生这种情况时做一些没有意义的事情。
NULL值表示该属性不适用或未知.有宗教战争争论他们是好事还是坏事但是我陷入"好事"阵营.
在许多情况下,它们通常需要区分已知值和未知值,并且对于那些没有合适默认值的属性,它们不需要哨兵值.
例如,虽然银行余额的默认值可能为零,但手机号码的默认值是多少.您可能需要区分"客户没有移动电话"和"客户的移动电话号码尚未知晓",在这种情况下,空白列不会(并且有一个额外的列来决定该列是否为1或其他不是一个好主意).
如果没有明确指定,默认值就是DBMS将放入列的内容.
与许多事情一样,每件事都有优点和缺点。
关于默认值的优点:如果没有给出其他值,它们使您能够将列设置为已知值。例如,在创建 BOOLEAN 列时,我通常为该列指定一个默认值(TRUE 或 FALSE,任何合适的值)并使该列 NOT NULL。通过这种方式,我可以确信该列将具有一个值,并且它会被设置为适当的。
关于默认值的缺点:并非所有东西都有默认值。
关于 NULL 的好处:并非所有东西始终都有已知值。例如,当创建一个代表一个人的新行时,我可能没有所有列的值 - 假设我知道他们的名字但不知道他们的出生日期。为出生日期设置默认值是不合适的 - 如果他们的生日实际上是 7 月 22 日,人们不喜欢在 1 月 1 日(如果这是默认值)收到生日贺卡。
NULL 的坏处:NULL 需要小心处理。在大多数建立在关系模型上的数据库中,通常实现的 NULL 是毒药 - 计算中存在 NULL 会导致计算结果为 NULL。比较中使用的 NULL 也可能导致意外结果,因为任何与 NULL 的比较都会返回 UNKNOWN(既不是 TRUE 也不是 FALSE)。例如,考虑以下 PL/SQL 脚本:
declare
nValue NUMBER;
begin
IF nValue > 0 THEN
dbms_output.put_line('nValue > 0');
ELSE
dbms_output.put_line('nValue <= 0');
END IF;
IF nValue <= 0 THEN
dbms_output.put_line('nValue <= 0');
ELSE
dbms_output.put_line('nValue > 0');
END IF;
end;
Run Code Online (Sandbox Code Playgroud)
上面的输出是:
nValue <= 0
nValue > 0
Run Code Online (Sandbox Code Playgroud)
这可能有点令人惊讶。至少根据此代码,您有一个 NUMBER (nValue) 既小于或等于零又大于零。发生这种情况的原因是 nValue 实际上是 NULL,并且所有与 NULL 的比较都会导致 UNKNOWN 而不是 TRUE 或 FALSE。这可能会导致难以弄清楚的细微错误。
分享和享受。
ado*_*ic 5
在数据仓库中,您总是希望拥有默认值而不是 NULL。
相反,您将获得诸如“未知”、“未准备好”、“缺失”之类的值
这使得 INNER JOIN 能够在事实表和维度表上高效执行,因为“一切总是有一个值”
归档时间: |
|
查看次数: |
46108 次 |
最近记录: |