基于单列未触发的列的约束

时间:2017-04-25 22:01:23

标签: postgresql

我制定了约束,将列completed标记为true,其他一些列必须具有值。

但由于某些原因,当completed标记为true时,当我将指定的列留空时,约束不会抱怨。我还特意插入NULL指定的列,但仍然没有约束。

有什么想法吗?

CREATE TABLE info (
  id bigserial PRIMARY KEY,
  created_at timestamptz default current_timestamp,
  posted_by text REFERENCES users ON UPDATE CASCADE ON DELETE CASCADE,
  title character varying(31),
  lat numeric,
  lng numeric,
  contact_email text,
  cost money,
  description text,
  active boolean DEFAULT false,
  activated_date date,
  deactivated_date date,
  completed boolean DEFAULT false,
  images jsonb,

  CONSTRAINT columns_null_check CHECK (
  (completed = true
  AND posted_by != NULL
  AND title != NULL
  AND lat != NULL
  AND lng != NULL
  AND contact_email != NULL
  AND cost != NULL
  AND description != NULL
  AND images != NULL) OR completed = false)
);

1 个答案:

答案 0 :(得分:2)

Chapter 9. Functions and Operators中:

  

要检查值是否为null,请使用谓词:

expression IS NULL
expression IS NOT NULL
     

或等效但非标准的谓词:

expression ISNULL
expression NOTNULL

因此,您无法使用value != NULL检查空值,只能使用value IS NULLvalue IS NOT NULL

对于布尔值,它们是相同的:

  

也可以使用谓词

测试布尔值
boolean_expression IS TRUE
boolean_expression IS NOT TRUE
boolean_expression IS FALSE
boolean_expression IS NOT FALSE
boolean_expression IS UNKNOWN
boolean_expression IS NOT UNKNOWN