间隔:如何确保表中的timstamp列中只有一行具有空值?

moj*_*-de 7 sql postgresql null constraints range

我有一个包含一个'有效直到'日期的列的表,我想确保只能在表中的一行中将其设置为null.是否有捷径可寻?

我的表看起来像这样(postgres):

CREATE TABLE 123.myTable(
some_id integer NOT NULL,
valid_from timestamp without time zone NOT NULL DEFAULT now(),
valid_until timestamp without time zone,
someString character varying)
Run Code Online (Sandbox Code Playgroud)

some_id而且valid_from是我的PK.我希望没有人在列valid_until中输入一个空值的行,如果此PK已经有一行为null.

谢谢

Chr*_*ers 3

在 PostgreSQL 中,有两种基本方法。

  1. 使用'infinity'而不是空。然后你的独特约束就会按预期工作。或者如果你不能这样做:
  2. CREATE UNIQUE INDEX null_valid_from ON mytable(someid) where valid_until IS NULL

这两种方法我都用过。我发现通常第一种方法更干净,它允许您使用范围类型并更好地排除较新版本的 PostgreSQL 中的约束(以确保基于给定的 someid 没有两个时间范围重叠),bt 第二种方法通常在以下情况下很有用:首先是做不到的。