2012-01-28 21 views
15

我想在varchar列中實現不區分大小寫的唯一性。但是,Postgres中沒有不區分大小寫的文本數據類型。由於原始文本大小並不重要,因此在插入具有UNIQUE約束的列之前將所有文本轉換爲小寫/大寫都是一個好主意。此外,它將需要一個INDEX快速搜索。Postgresql:插入列時自動小寫文本(或之前)

Postgres有什麼辦法在插入之前操作數據嗎?

我看了另外一個問題:How to automatically convert a MySQL column to lowercase。 它建議在插入/更新小寫文本時使用觸發器,或者使用小寫文本使用視圖。但是,所建議的方法都不能確保唯一性。此外,由於這些數據將被各種應用程序讀取/寫入,所以在每個應用程序中壓縮數據並不是一個好主意。

+5

目前的答案都不會在插入前小寫數據,這就是問題所在。請參閱http://stackoverflow.com/questions/18807709/create-a-postgres-rule-or-trigger-to-automatically-convert-a-column-to-lowercase。 – 2014-07-17 20:25:05

回答

25

你不需要區分大小寫的數據類型(雖然there is one

CREATE UNIQUE INDEX idx_lower_unique 
    ON your_table (lower(the_column)); 

這樣,你甚至不必浪費時間與原始數據。

+0

已驗證,它的工作原理與我想要的完全相同。存儲區分大小寫的數據(這不是必需的,但很好),但強制執行不區分大小寫的唯一性。 – user1144616 2012-01-28 16:43:03

16
ALTER TABLE your_table 
    ADD CONSTRAINT your_table_the_column_lowercase_ck 
    CHECK (the_column = lower(the_column)); 

From the manual

使用索引,以強制唯一約束的可以考慮 不應該直接訪問的實現細節。

+3

我使用了這個,因爲我可以讓我的應用程序以正確的小寫格式處理數據,而使用數據庫來處理它的好處 - 完整性檢查。 – 2015-05-02 22:50:18

相關問題