为什么大多数论坛都没有指定默认' ID(主键)列的值?

时间:2012-01-02 20:21:57

标签: mysql

大多数论坛都没有为ID列指定任何默认值。 我想知道他们为什么不这样做。

例如SMF。除了(PRIMARY KEY)ID列之外,它们为每列指定一个默认值。

编辑:我现在看到^这个问题的一部分有点'愚蠢'。

  • 通过指定默认值是否有性能优势?
  • 为什么不默认指定空值?
  • 如果你使用这个值,那么'NOT NULL'会抱怨:(类似于$ var ='';在php中)
编辑:但我认为你想要一个数据库抱怨,如果它没有得到,例如,用户名。当然,我不会允许注册字段留空(我确实在服务器端验证它们),但是如果我没有弄错,那么,如果通过魔法输入到数据库仍然是空的,数据库将接受这个。假设数据库使用NOT NULL和默认值。 问题:那么使用NOT NULL与默认值结合使用是什么?

提前致谢。 请记住,我是荷兰人,因此我可能犯了一些错误。

2 个答案:

答案 0 :(得分:2)

在大多数情况下,ID列是auto_increment。因此默认值无效。

编辑:

  

如果您使用值,则'NOT NULL'会抱怨:(类似于$ var ='';在php中)

使用NULL,表示文字NULL。不是零或空字符串。

答案 1 :(得分:2)

如果我们假设数据库中的id,primary key,column的默认值有意义(甚至有效),请考虑后果:

  1. 首先,它将允许用户或数据库脚本不提供id信息(这很好,因为大多数脚本都依赖于数据库来处理这个方面),但是
  2. 它还允许数据库“处理”它,并简单地插入具有默认值的新记录,无论可能是什么。这意味着
  3. 在许多情况下,可能会插入多个记录,这些记录具有 相同的 id值/主键。如果多个条目(例如论坛数据库)具有 相同的 值,您会如何区分用户?你怎么认出来的?
  4. 没有使用'default'的原因是因为,a:首先允许它是没有意义的,而b:它是无效的(尽管b是a的结果)。< / p>

      

    提供默认值是否有性能优势?

    与其说是“性能”好处,但它确实意味着如果没有提供任何价值,软件至少会某些想法会发生什么(无论该默认值是字符串,还是号码,枚举......)。

      

    为什么不默认指定空值?

    我认为应该控制数据库的所有条目,无论是允许插入的值,还是在发生错误时插入的值,或者用户的失败提供价值。允许对数据库的空条目可能是一个可控的情况,但是当可以指定默认值时,补偿空条目似乎是不必要的复杂。

      

    如果你使用这个值,那么'NOT NULL'会抱怨:(类似于$ var ='';在php中)?

    自从我上次使用MySQL以来已经有一段时间了,但null 类似于空字符串(以JavaScript评估{{1}的方式要成为'falsy'),绝对没有任何意义。空。整个真空,不存在的信息。然后,''要求一些(尽管它没有准确指定 )信息。这就是为什么应该提供默认值的原因,因为即使用户没有指定数据,它也会精确指定数据库中的内容。


    已编辑以回应OP(下方)的评论:

      

    但是我假设你想要一个数据库抱怨,如果它没有得到,例如,用户名。当然,我不会允许注册字段留空(我确实将它们验证为服务器端),但是如果我没有弄错,那么通过魔术输入到数据库仍然是空的,数据库将接受这个。如果它使用NOT NULL和默认值。那么使用NOT NULL和默认值是什么?

    我无法与所有情况或所有数据库/网络管理员做出的选择进行对话,但在我的个人用例中我会说建议考虑:

    1. 首先,对于此字段,空值是否合理,并且:
    2. 其次,如果空字段没有意义,是否应使用默认值?
    3. 在某些情况下,我不需要用户的详细信息(例如,他们的性别)对我或我提供的任何服务几乎没有影响,所以我不关心他们是否提供。在这种情况下,不使用默认值。

      在其他情况下,例如他们的年龄,它可能会有所不同(我不能记住法律的名称,但我记得有人提到Facebook和其他在线社团,只需要允许13岁的人或更老,参加)。在这种情况下,我要求我的用户说他们实际上已经超过13岁(通过复选框)然后为他们提供输入以插入他们的实际年龄/出生日期。在没有提供数据点的情况下(老实说,除了(假定​​的)法律义务之外我真的并不关心我的用户多大年纪)我的数据库默认为十三(或者在生日的情况,它默认为13年前今天(尽管有php脚本的帮助)。

      现在,NOT NULL 的方面是默认值?就我所见,没有任何意义。

      NOT NULL的整个概念是确保用户提供的值(否则不会创建记录,并且用户无法加入(或其他)他们正在注册的服务)。默认值是在此缺席时提供后备值。而且,从逻辑上讲,如果两个 允许在同一个字段上一起使用?将在触发NOT NULL条件之前插入默认值。那么......为什么要这么麻烦?您是否有证据表明某人或某些软件在同一字段上使用两个条件?老实说,我不能认为为什么