在postgres SQL中是否可以使用约束检查(或其他函数)为以下行为建模:
我有两列:
oncost (boolean)
oncostdescription (varchar)
如果oncost为true
,我希望oncostdescription
是强制性的(NOT NULL
,NOT EMPTY
)
如果concost为false
,我希望oncostdescription
不是强制性的(NULL
,EMPTY
)
编辑:
我忘了说我的postgres版本低于12。
这里有些人想出了一个很酷的功能,叫做generated columns
。
看起来很酷。但是只有当您有12岁以上
答案 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;