Sql FALSE和TRUE vs NULL和TRUE

Sql FALSE和TRUE vs NULL和TRUE,sql,postgresql,plpgsql,postgresql-9.5,Sql,Postgresql,Plpgsql,Postgresql 9.5,我有一个类型为BOOLEAN 首先(在插入时),值总是FALSE,只有在列更新为TRUE 所以问题是:将此列非空默认值设为FALSE,或者将此列默认值设为NULL,然后更新为TRUE(如果这样也将进行反向更新,则将列空设置为NULL而不是假值,因此在这种情况下,永远不会使用假值) 从性能和存储节省的角度来看,哪种选择更合适?它对存储没有任何意义。根据其他可为空的列,如果此列恰好将可为空的位图溢出到下一个字节,我们最多只讨论一个字节,但很可能它根本不会添加任何存储 对于性能(以及程序员的生产力/维

我有一个类型为
BOOLEAN

首先(在插入时),值总是
FALSE
,只有在列更新为
TRUE

所以问题是:将此列
非空默认值设为FALSE
,或者将此列
默认值设为NULL
,然后更新为
TRUE
(如果这样也将进行反向更新,则将列
空设置为NULL
而不是
值,因此在这种情况下,永远不会使用
值)


从性能和存储节省的角度来看,哪种选择更合适?

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

对于性能(以及程序员的生产力/维护),这在很大程度上取决于您计划如何使用它。这里没有足够的信息,如果不邀请任何真正阅读此问题的人参加所有项目会议,也不可能获得足够的信息

就我个人而言,当我有一个默认为false的布尔列(无论您选择如何表示它)并且在某个点上变为true并保持true时,我喜欢使用一个可为NULL的DateTime列来表示该值,其中任何日期都表示该值为true,NULL表示false。我的经验是,你最终几乎总是想知道价值实现的日期和时间


举个例子,我在高等教育部门工作。在这个行业里发生的一件事就是给学生发助学金奖励信。然后学生签名并返回字母。接受的奖励可能会被拒绝或取消,但这不会改变学生已签署本信并接受该奖励的事实。法规要求我们将这些信件存档,但从数据库的角度来看,只要知道信件中的奖励是否被接受这个布尔问题就足够了。很快我们就明白了,我们还需要知道奖项何时被接受。因此,datetime列用于该字段。

如果要假定为FALSE,除非特别设置为TRUE,则使用
非NULL默认值FALSE
。这还取决于您如何使用此列。如果您只测试column=TRUE的位置,那么不要认为这有什么关系。要点是NULL不等于FALSE。

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

如果表
some\u table
中有一列
null\u或
,则可以编写三条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\u或
中的值为true的行数;这可能会返回15。第三个查询返回
null\u或
为FALSE的行数,但如果在这些列中只存储null而不存储FALSE,它将返回0。要计算其他15行,您必须在以下内容上编写一个变量:

SELECT COUNT(*) FROM some_table WHERE null_or_true IS NULL;
这种违反直觉的行为意味着您将从被存储在表中的数据弄糊涂的人那里得到错误的答案,这是可以原谅的

因此,你应该选择:

NOT NULL DEFAULT FALSE

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

在回答存储问题时,您可能会在这里找到价值:谢谢,同样根据这里的其他答案,我选择使用
NOT NULL DEFAULT FALSE
,这真的会更清楚。关于保存日期,我还保存了每个更新日期,但带有另一个表,因为需要按日期报告所有事件(状态更改)。