条件非空约束

uyhoqukh  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(298)

在postgres sql中,有没有一种方法可以通过约束检查(或其他函数)对以下行为进行建模:
我有两列:
oncost (boolean) oncostdescription (varchar) 如果oncost是 true ,我想要 oncostdescription 必须( NOT NULL , NOT EMPTY )
如果concost是 false ,我想要 oncostdescription 不是强制性的( NULL , EMPTY )
编辑:
我忘了说我的博士后版本低于12。
有些人想出了一个很酷的功能叫做 generated columns .
看起来很酷。但前提是你有12+

x7rlezfr

x7rlezfr1#

你可以使用 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 = '')
        )
    )
)
smdnsysy

smdnsysy2#

如果我理解正确,生成的列可能会执行您想要的操作:

create table t (
     . . . 
     oncostdescription varchar,
     oncost boolean generated always as (oncostdescription is not null)
);

这假设你想要 oncost 作为指示是否 oncostdescription 有一个值——这与问题的措辞是一致的。

csga3l58

csga3l583#

这个 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;

相关问题