Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在列中放置默认值有什么好处?_Sql_Sql Server_Database_Database Design - Fatal编程技术网

Sql 在列中放置默认值有什么好处?

Sql 在列中放置默认值有什么好处?,sql,sql-server,database,database-design,Sql,Sql Server,Database,Database Design,如果这个问题太宽泛,我道歉。我是一名DBA,我与一位开发人员合作,他认为列默认值是个坏主意,只需将列设置为不允许空值就足够了 我从开发人员的角度寻找列默认值的好处。感谢您的评论。默认值使向表中插入新行变得更加容易-如果默认值没有问题,则不需要显式指定具有默认值的所有列,也不需要在insert语句中提供值(如“LastChangeOn”日期列的getdate()) 我看不出有任何理由不在列上使用默认值,实际上,当存在有效且合理的默认值时。我不明白为什么您的开发人员对默认值如此反感——它们总是可以在

如果这个问题太宽泛,我道歉。我是一名DBA,我与一位开发人员合作,他认为列默认值是个坏主意,只需将列设置为不允许空值就足够了


我从开发人员的角度寻找列默认值的好处。感谢您的评论。

默认值使向表中插入新行变得更加容易-如果默认值没有问题,则不需要显式指定具有默认值的所有列,也不需要在insert语句中提供值(如“LastChangeOn”日期列的
getdate()

我看不出有任何理由不在列上使用默认值,实际上,当存在有效且合理的默认值时。我不明白为什么您的开发人员对默认值如此反感——它们总是可以在初始插入时被覆盖(此后不再发挥作用)


Marc取决于您的要求。如果您的规则需要最小值,并且NULL被视为无效选项,则可能需要使用默认值。例如,如果您有审计字段,则不希望在CREATED_DATE列中有空值。但是,如果您有一个中间名属性,您可能希望允许为null,因为不是每个人都有一个中间名。同样,这取决于您的需求。

如果要向现有表中添加列,并且不希望该列为空,则必须提供默认值

许多开发人员不喜欢将业务逻辑放入数据库中。开发人员可能会认为他正在失去控制(他可以编写自己的例程,将默认值设置为null以外的值)。我不确定他是否会认为这是帮了他一个忙/从他的盘子里拿走了一些任务


我处理的数据库是第三方应用程序的后端,我对应用程序的处理能力有限(比如使用默认值)。我不能强制应用程序在所有的数据输入面板上都有一个默认值,所以我想在数据库中有控制权的字段上设置一个默认值。我无法访问他们的代码,我们的用户也不想等待升级。

列默认值允许您从代码或应用程序逻辑中删除大量创建记录的麻烦

Advantage#1:如果您有一个包含2列用户信息和20列tinyint/boolean字段的表,假设它们是隐私设置,您要在该表中创建一个新记录,而不使用
默认值
,则必须指定查询中的每一列。您可能希望这些记录在默认情况下有一个通用设置,您可以使用
default
值进行设置。当你插入一条记录时,你只需要指定两个用户信息字段,瞧,你的记录是用一组很好的公共隐私设置创建的。之后,您可以单独调整标志


优势#2:向前兼容性!如果代码中有一堆
INSERT
s,然后添加了一些列,那么如果不指定
DEFAULT
值(通常假设
NULL
s不会剪切它),就必须返回并修改所有这些
INSERT
s。通常不需要为新列更新旧代码(因为旧代码本质上并不关心新列),因此,如果您必须开始返回并在代码中处理每一个新列时,这将是@$$中的一个巨大的痛苦。

列默认值允许程序员懒惰。这不一定是坏事。

开发人员提出了一个非常好的观点。作为一般规则,尽可能明确,而不是依赖于隐含行为是一个好主意

我认为他/她可能是对的。如果在列上设置默认值,并且代码依赖于此,那么更改默认值可能会在以后引入难以消除的bug


然而,与此相反的是,将默认值放入数据表本身允许您在以后更改列的默认值,而无需重新编译代码。也就是说,如果编写代码的人有足够的前瞻性,除非绝对必要,否则不会覆盖默认值。

这有助于版本控制。例如,如果旧代码(INSERT语句)需要一个包含10列的表,而旧代码必须与包含12列的新表一起使用,则需要为新列提供默认值,或者使新列为空


它还取决于NULL对给定列的确切含义,因为默认值的选择也是对列中NULL的选择。空标记是否意味着未知、不可知、尚未改变、未知的过去、未知的未来。这些标记略有不同,NULL只能表示其中一个

我认为依赖数据库中的默认值完全不利于防御性编程,也不利于你看到未来的噩梦。

一般来说,默认值是不需要的。如果数据有一些有意义的默认值,那么继续在数据库中编码。但大多数数据没有默认值。名字的默认值是什么?抛出NOTNULL并让代码赋值。不要包含默认名称,因为如果代码忘记设置名字而不是使用伪造的默认名字,则希望引发错误

我发现默认值很方便的一个地方是一个简单的“审计”方案。每个表都有四列:InsertedAt、InsertedBy、UpdatedAt、UpdatedBy,并带有NOTNULL约束。使用after触发器设置值,但SQL Server将检查列是否具有值。如果没有发生违反约束的情况,它就永远不会触发。所以我