Re: interesting check constraint behavior

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: interesting check constraint behavior
Дата
Msg-id 28792.1262821136@sss.pgh.pa.us
обсуждение исходный текст
Ответ на interesting check constraint behavior  ("Gauthier, Dave" <dave.gauthier@intel.com>)
Список pgsql-general
"Gauthier, Dave" <dave.gauthier@intel.com> writes:
> thedb=# create table foo (col1 text, constraint chk check (col1 in ('a','b','c',null)));
> CREATE TABLE
> thedb=# insert into foo (col1) values ('xxx');
> INSERT 0 1

> Hmmmm... I would have thought that this would have violated the constraint because 'xxx' is not null and nit one of
theallowed values. 

Nulls are tricky.  That constraint is equivalent to

col1 = 'a' or col1 = 'b' or col1 = 'c' or col1 = null

The last reduces to null (not false), so you get either TRUE or NULL out
of the OR condition.  CHECK constraints are defined to not fail on a null
result (which is not terribly consistent, but it's what the spec says).
So basically that check constraint will never fail.

> Is there a different way I can allow for a static set of values AND null too?

Plain old check (col1 in ('a','b','c')) would work that way.  If you
actually want to force it to be non-null, you have to say that
explicitly; usually people use a separate NOT NULL constraint for that.

            regards, tom lane

В списке pgsql-general по дате отправления:

Предыдущее
От: "Gauthier, Dave"
Дата:
Сообщение: interesting check constraint behavior
Следующее
От: "Joshua D. Drake"
Дата:
Сообщение: Re: Minimizing disk space