假设我想要一个复合类型的地址,例如:
create type address as (
city text,
address_line text,
zip_code int
);
为了使数据完整性更好,我不想让NULL
s 成为city
、address_line
或zip_code
. 所以我想not null
对这些领域有一个约束。
创建域检查对我不起作用。所以这段代码会产生错误:
create domain address_domain as address
check (
value.city is not null and
value.address_line is not null and
value.zip_code is not null
);
您可能会说:“好吧,为什么不将地址存储为三列,并在字段中添加约束?”。我会回答说我希望能够使地址本身为空,但如果地址存在,它的所有字段也应该存在。像这样的东西:
create table companies (
id serial primary key,
name text not null,
headquaters address -- this one can be null tho
)
复合类型的检查约束的正确语法如下所示:
让我们检查:
但要注意最后一行。看来这不是你想要的。尝试明确地允许:
我不知道您是否可以为复合类型创建此类域约束,但如果您使用如下常规类型,则可以添加如下约束:
对于更复杂的场景,您可以为每个属性添加唯一权重并检查某些组合:
也就是说,您可能希望将您的设计规范化为: