FALSE和TRUE与NULL和TRUE

时间:2015-12-21 17:02:51

标签: sql postgresql plpgsql postgresql-9.5

我的列类型为BOOLEAN

首先(在INSERT上),值始终为FALSE,只有在更新后的列为TRUE

所以问题是:制作此列NOT NULL DEFAULT FALSE,或将此列DEFAULT NULL设为TRUE,然后更新为NULL(如果这样也会撤消更新,请设置列FALSE }而不是FALSE值,所以在这种情况下,永远不会使用{{1}}值)

哪种选择会更好地保持性能和存储节省?

3 个答案:

答案 0 :(得分:4)

它对存储没有任何意义。根据其他可空列,如果此列恰好将可空位图溢出到下一个字节,我们最多只能说一个字节,但很可能它根本不会添加任何存储。

对于性能(以及程序员的工作效率/维护),它很大程度上取决于您计划如何使用它。这里没有足够的信息,也没有可能获得足够的信息而不邀请任何实际读取此问题的人参加您的所有项目会议。

就个人而言,当我有一个布尔列默认为假(但你选择代表它),然后在某些时候会变为真,保持真实,我喜欢使用可以为空的 DateTime 此列的列,其中任何日期都表示值为true,NULL表示false。我的经验是,你几乎总是想知道价值成真的日期和时间。

作为一个例子,我在高等教育中工作。在这项业务中发生的一件事是向学生发送经济援助奖励信。然后学生签名并归还这些信件。接受的奖励可能会被拒绝或取代,但这不会改变学生签署此信并接受此奖项的事实。法规要求我们保留这些信件,但从数据库的角度来看,只要知道信中的奖项是否被接受的布尔问题就足够了。很明显,我们还需要知道何时奖项被接受。因此,datetime列用于该字段。

答案 1 :(得分:3)

如果你想假设FALSE,除非特别设置为TRUE,那么使用NOT NULL DEFAULT FALSE。它还取决于您使用此列的方式。如果您只测试column = TRUE的位置,那么不要认为它很重要。关键是NULL不等于FALSE。

答案 2 :(得分:3)

假装NULL为FALSE的麻烦是NULL既不是FALSE也不是TRUE。

如果表null_or_true中有列some_table,则可以编写三个SELECT语句:

SELECT COUNT(*) FROM some_table;
SELECT COUNT(*) FROM some_table WHERE null_or_true;
SELECT COUNT(*) FROM some_table WHERE NOT null_or_true;

第一个获取总行数,例如30.第二个获取null_or_true中的值为TRUE的行数;这可能会返回15.第三个查询返回null_or_true为FALSE的行数,但如果您只在这些列中存储NULL而不是FALSE,则返回0.要计算其他15行,您需要必须写一个变体:

SELECT COUNT(*) FROM some_table WHERE null_or_true IS NULL;

这种反直觉行为意味着你会得到错误的答案,这些人可能会因为你表中存储的数据而感到困惑。

因此,你应该选择:

NOT NULL DEFAULT FALSE

另一条道路迟早会导致疯狂。