2017-08-10 77 views
0

我有如下表唯一約束到特定的文本

create table order(
status text, 
user_id int (FK to user table), 
time time stamp with time zone 

); 

而下面的約束的狀態

CONSTRAINT valid_status CHECK (status = ANY (ARRAY['requested'::text, 'accepted'::text, 'declined_by_manager'::text, 'declined_by_user'::text, 'finished_by_user'::text, 'canceled_by_system'::text, 'washing'::text, 'finished_by_manager'::text])) 

我想要的是,有可能只有一個訂單狀態爲「要求」並與用戶的「n」 水木清華像Alter table order add constraint "only_one_order_per_user" UNIQUE(user_id, status = 'requested') 我真的newbee與Postgres的。在此先感謝

回答

1
create unique index some_name on "order" (user_id, (case when status = 'requested' then 1 else null end)); 

與空<背後的想法>空

也或許你更好的使用ENUM的狀態?..甚至更好地創造具有鮮明行和FK的關係狀態?..

樣品:

t=# create table "order" (
status text, 
user_id int, 
time timestamp with time zone 
); 
CREATE TABLE 
Time: 6.345 ms 
t=# create unique index some_name on "order" (user_id, (case when status = 'requested' then 1 else null end)); 
CREATE INDEX 
Time: 16.979 ms 
t=# insert into "order" select 'requested',1,now(); 
INSERT 0 1 
Time: 17.793 ms 
t=# insert into "order" select 'other',1,now(); 
INSERT 0 1 
Time: 1.137 ms 
t=# insert into "order" select 'other',1,now(); 
INSERT 0 1 
Time: 6.735 ms 
t=# insert into "order" select 'other',1,now(); 
INSERT 0 1 
Time: 0.867 ms 
t=# insert into "order" select 'requested',1,now(); 
ERROR: duplicate key value violates unique constraint "some_name" 
DETAIL: Key (user_id, (
CASE 
    WHEN status = 'requested'::text THEN 1 
    ELSE NULL::integer 
END))=(1, 1) already exists. 
Time: 0.342 ms 
0

試試這個。你應該能夠建立你的表,所以你只能有請求的狀態,不知道是否允許NULL。然後爲user_id和狀態添加一個唯一的。

create table order(
status text CHECK (status in ('requested'[add more statuses here])) , 
user_id int, 
time time stamp with time zone 
UNIQUE (status, user_id) 
); 
+0

感謝響應,但狀態不僅是請求可以完成,接受和開始,CONSTRAINT valid_status CHECK(status = ANY(ARRAY ['requested':: text,'accepted':: text,'declined_by_manager':: text,'declined_by_user':: text'' finished_by_user'::文本,‘canceled_by_system’::文本,‘洗’::文本,‘finished_by_manager’::文)) –

+0

編輯我的回答對多個狀態 – Mokadillion

+0

你的情況,我將無法創建2個declined_by_user訂單。我只需要一個狀態爲「請求」的訂單,而第i個用戶標識爲1 –