条件非空约束

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

在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 约束条件:

  1. create table mytable (
  2. oncost boolean
  3. oncostdescription varchar(50),
  4. constraint ck_mytable check(
  5. not oncost
  6. or not (oncostdescription is null or oncostdescription = '')
  7. )
  8. )

此短语为:要么布尔标志为false,要么描述既不为null也不为空。
您也可以将其表示为:

  1. create table mytable (
  2. oncost boolean
  3. oncostdescription varchar(50),
  4. constraint ck_mytable check(
  5. not (
  6. oncost
  7. and (oncostdescription is null or oncostdescription = '')
  8. )
  9. )
  10. )
展开查看全部
smdnsysy

smdnsysy2#

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

  1. create table t (
  2. . . .
  3. oncostdescription varchar,
  4. oncost boolean generated always as (oncostdescription is not null)
  5. );

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

csga3l58

csga3l583#

这个 oncost 列是冗余的(完全依赖于 oncostdescription ),因此可以根据需要进行计算。postgres-12支架 generated always as ... 柱:

  1. CREATE TABLE omg
  2. ( seq integer not null generated always as identity
  3. , oncostdescription varchar
  4. , oncost boolean NOT NULL generated always as ( oncostdescription IS NOT NULL AND oncostdescription > '') STORED
  5. );
  6. insert into omg(oncostdescription) VALUES ( NULL), (''), ('a'), (' ');
  7. select * from omg;

结果:

  1. CREATE TABLE
  2. INSERT 0 4
  3. seq | oncostdescription | oncost
  4. -----+-------------------+--------
  5. 1 | | f
  6. 2 | | f
  7. 3 | a | t
  8. 4 | | t
  9. (4 rows)

和西塞 oncost 字段是可计算的,它也可以打包在视图中:(具有完全相同的结果)

  1. CREATE VIEW vomg AS
  2. SELECT seq, oncostdescription
  3. , ( oncostdescription IS NOT NULL AND oncostdescription > '')::boolean AS oncost
  4. FROM omg
  5. ;
  6. SELECT * FROM vomg;
展开查看全部

相关问题