Re: Check constraint problem

Поиск
Список
Период
Сортировка
От Michael Glaesemann
Тема Re: Check constraint problem
Дата
Msg-id F69EA51E-7A49-4916-9F19-A170E4C6387F@myrealbox.com
обсуждение исходный текст
Ответ на Check constraint problem  ("Michael Schmidt" <MichaelMSchmidt@msn.com>)
Список pgsql-general
On Jul 1, 2005, at 12:04 PM, Michael Schmidt wrote:

> The constraint statement:
>
> ALTER TABLE "ClinData" ADD CONSTRAINT "Control_Score" CHECK
> ((("Control_Score_M" IS NULL) AND ("Control_Score_SD" IS NULL) ) OR
> (("Control_Score_M" IS NOT NULL) AND ("Control_Score_SD" >= 0.0)))
>
> This statement executes okay.  It prevents Control_Score_M of NULL
> and Control_Score_SD = 1.0 (as it should).  However, it allows
> Control_Score_M = 1 and Control_Score_SD of NULL (it shouldn't).
> Any thoughts about what is wrong.  Thanks!

I think the problem may be that Control_Score_SD >= 0.0 is evaluated
in interesting ways when Control_Score_SD is NULL. What happens if
you do this?

ALTER TABLE "ClinData" ADD CONSTRAINT "Control_Score"
     CHECK (
         ( ("Control_Score_M" IS NULL)
             AND ("Control_Score_SD" IS NULL) )
         OR ( ("Control_Score_M" IS NOT NULL)
             AND ("Control_Score_SD" IS NOT NULL)
             AND ("Control_Score_SD" >= 0.0) )
     );

You can probably drop the innermost parens, I believe. Might improve
legibility

ALTER TABLE "ClinData" ADD CONSTRAINT "Control_Score"
     CHECK (
         ( "Control_Score_M" IS NULL
             AND "Control_Score_SD" IS NULL )
         OR ( "Control_Score_M" IS NOT NULL
             AND "Control_Score_SD" IS NOT NULL
             AND "Control_Score_SD" >= 0.0 )
     );

Does this help?

Michael Glaesemann
grzm myrealbox com


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

Предыдущее
От: "Marc G. Fournier"
Дата:
Сообщение: Re: [ANNOUNCE] Language to use with SQL database - Number ONE computer
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Check constraint problem