2017-02-23 41 views
0

我想修改表約束。從現在起,名字必須是獨一無二的。但是,我想要具有唯一的名稱,只有當給定名稱的行是活動的。所以我添加了列is_active。將UNIQUE約束轉換爲CHECK或觸發器

CREATE TABLE item 
(
(...) 
name character varying(50) NOT NULL, 
is_active boolean NOT NULL DEFAULT true, 
CONSTRAINT uc_item_name UNIQUE (name), 
(...) 
) 

我可以刪除唯一約束,並添加觸發器或函數調用,它會這麼做:

  • 如果給新名稱未在表回報存在真實的或允許 插入,
  • 如果給出至少一行中的新名稱退出,重複執行 ,並檢查是否至少有一個是活動的。如果是 - 失敗插入 否則將行添加到表中。

任何人都可以幫我嗎?這只是我與Postgres的冒險開始。我使用的是9.6版

回答

4

您可以創建一個部分唯一索引:

create unique index on item (name) 
where is_active; 
+0

這就是anwser!謝謝。我只是想知道如果我能夠通過CHECK約束來調用返回布爾值的函數。可能嗎?我問,因爲我認爲這將是實現我的目標的最優雅的方式 –

+1

@Konrad:在默認[隔離級別](https://www.postgresql.org/docs/current/static/transaction-iso html的);兩個使用相同'name'的同時插入不能看到對方,並且兩者都會通過檢查。一個唯一的索引自動處理併發。 –