2016-03-25 35 views
1

假設我創建了以下域中的所有允許值:PostgreSQL的:找到一個域

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中選擇所有允許的值,而不是硬編碼創建常量的所有可能的值。

不久:如何進行查詢,選擇域的所有可能的值? 在我的例子,我想有一個查詢將返回:

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

回答

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); 

這有其他優點:

  • 你可以很容易地通過觀察看到有效值在桌上。
  • 您可以添加有關狀態的其他信息。
  • 很容易添加新的狀態值。
+0

好的,但是你知道這個查詢是否有可能嗎?因爲我以這種方式找到了DB。 – fresko

+0

我的意思是,我沒有決定數據庫的結構。 – fresko

相關問題