Postgresql:查找域

时间:2016-03-25 11:14:18

标签: postgresql verification

假设我创建了以下域:

CREATE DOMAIN MY_STATUS AS VARCHAR NOT NULL DEFAULT 'STATUS0' CHECK(VALUE in ('STATUS1', 'STATUS2', 'STATUS3'));

正如预期的那样,在类型为MY_STATUS的列中,我只能输入值:

  • 'STATUS0'
  • 'STATUS1'
  • 'STATUS2'
  • 'STATUS3'

现在,假设我想在发送插入或更新到我的数据库之前验证此列。我需要知道允许哪些值,这样,如果我有status = STATUS4,我将在发送插件到DB之前出错,我可以管理它。由于域将来可能会发生变化,我需要从DB中选择所有允许的值,而不是硬编码所有可能的值来创建常量。

简要说明:如何进行选择域的所有可能值的查询? 在我的示例中,我想要一个将返回的查询:

'STATUS0', 'STATUS1', 'STATUS2', 'STATUS3'

1 个答案:

答案 0 :(得分:0)

我建议您使用外键引用而不是类型或check约束。虽然您可以设计一个复杂的查询来解析约束,但使用外键更容易:

create table valid_domain_statuses (
    status varchar(32) primary key
);

insert into valid_domain_statuses (status)
    select 'STATUS0' union all
    select 'STATUS1' union all
    select 'STATUS2' union all
    select 'STATUS3' ;

. . .

alter table t add constraint fk_my_status
    foreign key (status) references valid_domain_statuses(status);

这还有其他优点:

  • 您可以通过查看表格轻松查看有效值。
  • 您可以添加有关状态的其他信息。
  • 添加新状态值很容易。