在迁移中,整数字段的 :default => 0 和 :null => false 有什么区别?

56
如果我使用迁移来更新数据库,并像这样添加一个整数字段:
t.integer :foo :default => 0, :null => false

数据库中现有和新记录的默认状态是什么?我希望答案是: - 两者都将读取 foo 为 0。

如果我有 :null => false,那么是否需要默认值为 => 0?

只是想了解这两者之间的区别...


6
这取决于您的数据库,而不是Rails。 - shingara
1个回答

112

:null => false 告诉数据库不接受 NULL 值。

:default => 0 做了两件事:

  1. 告诉你的数据库在查询中未指定或为空时使用“0”作为默认值。
  2. 告诉 Rails 在创建新对象时使用“0”作为默认值。

第二点确保您保存新对象时实际上有一个有效的值。

回答您的问题:如果您不想在数据库中有 NULL 值,可以设置 :null => false,否则只需使用 :default 参数。请注意,“0”和 NULL 不是相同的东西。

没有 NULL 值可能对索引目的很重要,或者如果您需要向第三方提供直接数据库访问。


告诉你的数据库在查询中未指定NULL或未指定任何内容时使用“0”作为默认值。这是否意味着在迁移之前存在数据库记录时读取会返回为0?因此,如果我在旧记录上执行Table.value操作,则value将等于0吗? - cmaughan
是的。如果您有一个包含“NULL”值的表列,但设置了默认值,则将返回该默认值。 - Ariejan
1
这是一些有启发性和有价值的信息:如果您需要为索引目的或向第三方提供直接数据库访问,则不具有NULL值可能很重要。 - ahnbizcad
即使是一个简单的问题,这也是一个很好的答案。 - ahnbizcad
2
@ahnbizcad不理解这个,第三方的直接连接如何与不想要空值相关? - Joel Blum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接