条件非空约束

时间:2020-06-15 10:14:40

标签: sql postgresql create-table check-constraints

在postgres SQL中是否可以使用约束检查(或其他函数)为以下行为建模:

我有两列:

  • oncost (boolean)
  • oncostdescription (varchar)

如果oncost为true,我希望oncostdescription是强制性的(NOT NULLNOT EMPTY

如果concost为false,我希望oncostdescription不是强制性的(NULLEMPTY

编辑:
我忘了说我的postgres版本低于12。
这里有些人想出了一个很酷的功能,叫做generated columns
看起来很酷。但是只有当您有12岁以上

3 个答案:

答案 0 :(得分:1)

您可以使用check约束:

create table mytable (
    oncost boolean
    oncostdescription varchar(50),
    constraint ck_mytable check(
        not oncost 
        or not (oncostdescription is null or oncostdescription = '')
    )
)

这句话是:布尔标志为false,或者说明既不为null也不为空。

您也可以这样表示:

create table mytable (
    oncost boolean
    oncostdescription varchar(50),
    constraint ck_mytable check(
        not (
            oncost 
            and (oncostdescription is null or oncostdescription = '')
        )
    )
)

答案 1 :(得分:1)

如果我理解正确,生成的列可能会满足您的要求:

updateUIView()

这假设您希望将create table t ( . . . oncostdescription varchar, oncost boolean generated always as (oncostdescription is not null) ); 作为布尔值标记,指示oncost是否具有值-与问题的表达方式一致。

答案 2 :(得分:1)

oncost列是多余的(完全取决于oncostdescription),因此可以在需要时进行计算。 Postgres-12支持generated always as ...列:


CREATE TABLE omg
        ( seq integer not null generated always as identity
        , oncostdescription varchar
        , oncost boolean NOT NULL generated always as ( oncostdescription IS NOT NULL AND oncostdescription > '') STORED
        );

insert into omg(oncostdescription) VALUES ( NULL), (''), ('a'), (' ');

select * from omg;

结果:


CREATE TABLE
INSERT 0 4
 seq | oncostdescription | oncost 
-----+-------------------+--------
   1 |                   | f
   2 |                   | f
   3 | a                 | t
   4 |                   | t
(4 rows)

并且oncost字段是可计算的,它也可以打包在一个视图中: (结果完全相同)


CREATE VIEW vomg AS
SELECT seq, oncostdescription
        , ( oncostdescription IS NOT NULL AND oncostdescription > '')::boolean AS oncost
FROM omg
        ;

SELECT * FROM vomg;
相关问题