【问题标题】:How to set a NULL value for a PostgreSQL column with 'timestamptz' data type?如何为具有“timestamptz”数据类型的 PostgreSQL 列设置 NULL 值?
【发布时间】:2020-01-10 12:15:26
【问题描述】:

我想创建两个数据类型为“timestamptz”的列。

第一列的名称是created,反映了项目被添加到表中的日期:

created timestamptz NOT NULL DEFAULT now()

现在问题来了,我需要一个新列来反映项目何时被修改(更改),但有可能某些文章永远不会被更改,因此该列需要以 NULL timestamptz 值或其他内容开头。

modified timestamptz NOT NULL DEFAULT ...

我检查了 Wordpress 数据库作为灵感,看看他们如何处理这个问题。 Wordpress 使用 mySQL。我注意到他们为他们的post_modified 添加了值为0000-00-00 00:00:00 的日期时间类型,这允许他们对列使用NOT NULL 定义。

有没有办法在 PostgreSQL 中做类似的事情?还是删除 NOT NULL 并允许 modified 列保持为空直到项目被修改是更好的做法?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    或者更好的做法是删除 NOT NULL 并允许修改后的列保持为空,直到项目被修改

    这是正确的方法(至少在我看来)。

    Postgres 不允许您存储无效的日期或时间戳值(0000-00-00 00:00:00 是)


    如果您想要某个遥远过去的值,这样您就不需要关心null 值并且与“当前”值的比较按预期工作,您可以使用无穷大:

    modified timestamptz NOT NULL DEFAULT '-infinity'
    

    但我会选择 NULL 值来表明该行没有被更改

    【讨论】:

      【解决方案2】:

      a_horse_with_no_name 的答案的替代方法是重新考虑“修改”的含义。如果创建也是一种修改,那么您可以将“现在”保留为默认值。

      检查已更改的内容然后变为modified <> created 而不是NOT NULL

      【讨论】:

      • 不,创建不是修改,只有当用户在网络应用程序中点击特定项目的“编辑”按钮时。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2022-01-20
      • 2020-02-01
      • 2018-04-11
      • 2013-12-15
      • 2022-11-07
      • 2018-02-09
      相关资源
      最近更新 更多