PostgreSQL有可能在字符列上創建可延遲的唯一約束,但不區分大小寫嗎?可推遲,不區分大小寫的唯一約束
假設以下基本表:
CREATE TABLE sample_table (
my_column VARCHAR(100)
);
如果不需要延遲的約束,這是與函數創建唯一索引一樣簡單,例如:
CREATE UNIQUE INDEX my_unique_index ON sample_table(UPPER(my_column));
延遲的約束檢查需要創建明確的約束,例如:
ALTER TABLE sample_table
ADD CONSTRAINT my_unique_constraint UNIQUE(my_column)
DEFERRABLE INITIALLY IMMEDIATE;
Andunfortunatel y不可能在唯一約束中使用任意函數。
一種可能的解決方法是創建具有與my_column
相同內容的其他列,但是大寫,在每次更新/插入後通過觸發更新,然後在此人工列上創建可延遲的唯一約束。然而,這聽起來像一個非常醜陋的黑客。
或者,應該可以使用CREATE CONSTRAINT TRIGGER
並手動檢查不區分大小寫的唯一性(當然,常規索引仍然是必需的)。這聽起來有點過於複雜,對於這樣一個簡單的(而且很流行的,我想)的要求。
圍繞此限制有沒有更簡單和/或更優雅的方法?
你的Postgres版本? –
現在是9.1。然而,如果在較新版本中有一個很好的解決方案,我會非常樂意閱讀它:) –
檢查'EXCLUDE'約束。可以設置它們,以便像不區分大小寫的'UNIQUE'一樣操作。 –