Postgresql
在 Postgres 的列中儲存十六進制顏色
我想將十六進制顏色程式碼儲存在我的 Postgres 數據庫的列中。我想對列進行限制,以確保它具有十六進制顏色的格式(範例:)
#FFAA00
限制的一些範例是:它必須以#
. 它必須是 7 個字元。我找到了以下方法來實現這一點,但有沒有更好更簡單的方法來做到這一點?ALTER TABLE stone.event_type_tags ADD CONSTRAINT hex_color CHECK ( ( color IS NULL ) OR ( ( LENGTH(color) = 7 ) AND ( substr(color,1,1) = '#' ) AND ( (substr(color,2,1) = '0') OR (substr(color,2,1) = '1') OR (substr(color,2,1) = '2') OR (substr(color,2,1) = '3') OR (substr(color,2,1) = '4') OR (substr(color,2,1) = '5') OR (substr(color,2,1) = '6') OR (substr(color,2,1) = '7') OR (substr(color,2,1) = '8') OR (substr(color,2,1) = '9') OR (substr(color,2,1) = 'A') OR (substr(color,2,1) = 'B') OR (substr(color,2,1) = 'C') OR (substr(color,2,1) = 'D') OR (substr(color,2,1) = 'E') OR (substr(color,2,1) = 'F') OR (substr(color,2,1) = 'a') OR (substr(color,2,1) = 'b') OR (substr(color,2,1) = 'c') OR (substr(color,2,1) = 'd') OR (substr(color,2,1) = 'e') OR (substr(color,2,1) = 'f') ) AND ( (substr(color,3,1) = '0') OR (substr(color,3,1) = '1') OR (substr(color,3,1) = '2') OR (substr(color,3,1) = '3') OR (substr(color,3,1) = '4') OR (substr(color,3,1) = '5') OR (substr(color,3,1) = '6') OR (substr(color,3,1) = '7') OR (substr(color,3,1) = '8') OR (substr(color,3,1) = '9') OR (substr(color,3,1) = 'A') OR (substr(color,3,1) = 'B') OR (substr(color,3,1) = 'C') OR (substr(color,3,1) = 'D') OR (substr(color,3,1) = 'E') OR (substr(color,3,1) = 'F') OR (substr(color,3,1) = 'a') OR (substr(color,3,1) = 'b') OR (substr(color,3,1) = 'c') OR (substr(color,3,1) = 'd') OR (substr(color,3,1) = 'e') OR (substr(color,3,1) = 'f') ) AND ( (substr(color,4,1) = '0') OR (substr(color,4,1) = '1') OR (substr(color,4,1) = '2') OR (substr(color,4,1) = '3') OR (substr(color,4,1) = '4') OR (substr(color,4,1) = '5') OR (substr(color,4,1) = '6') OR (substr(color,4,1) = '7') OR (substr(color,4,1) = '8') OR (substr(color,4,1) = '9') OR (substr(color,4,1) = 'A') OR (substr(color,4,1) = 'B') OR (substr(color,4,1) = 'C') OR (substr(color,4,1) = 'D') OR (substr(color,4,1) = 'E') OR (substr(color,4,1) = 'F') OR (substr(color,4,1) = 'a') OR (substr(color,4,1) = 'b') OR (substr(color,4,1) = 'c') OR (substr(color,4,1) = 'd') OR (substr(color,4,1) = 'e') OR (substr(color,4,1) = 'f') ) AND ( (substr(color,5,1) = '0') OR (substr(color,5,1) = '1') OR (substr(color,5,1) = '2') OR (substr(color,5,1) = '3') OR (substr(color,5,1) = '4') OR (substr(color,5,1) = '5') OR (substr(color,5,1) = '6') OR (substr(color,5,1) = '7') OR (substr(color,5,1) = '8') OR (substr(color,5,1) = '9') OR (substr(color,5,1) = 'A') OR (substr(color,5,1) = 'B') OR (substr(color,5,1) = 'C') OR (substr(color,5,1) = 'D') OR (substr(color,5,1) = 'E') OR (substr(color,5,1) = 'F') OR (substr(color,5,1) = 'a') OR (substr(color,5,1) = 'b') OR (substr(color,5,1) = 'c') OR (substr(color,5,1) = 'd') OR (substr(color,5,1) = 'e') OR (substr(color,5,1) = 'f') ) AND ( (substr(color,6,1) = '0') OR (substr(color,6,1) = '1') OR (substr(color,6,1) = '2') OR (substr(color,6,1) = '3') OR (substr(color,6,1) = '4') OR (substr(color,6,1) = '5') OR (substr(color,6,1) = '6') OR (substr(color,6,1) = '7') OR (substr(color,6,1) = '8') OR (substr(color,6,1) = '9') OR (substr(color,6,1) = 'A') OR (substr(color,6,1) = 'B') OR (substr(color,6,1) = 'C') OR (substr(color,6,1) = 'D') OR (substr(color,6,1) = 'E') OR (substr(color,6,1) = 'F') OR (substr(color,6,1) = 'a') OR (substr(color,6,1) = 'b') OR (substr(color,6,1) = 'c') OR (substr(color,6,1) = 'd') OR (substr(color,6,1) = 'e') OR (substr(color,6,1) = 'f') ) AND ( (substr(color,7,1) = '0') OR (substr(color,7,1) = '1') OR (substr(color,7,1) = '2') OR (substr(color,7,1) = '3') OR (substr(color,7,1) = '4') OR (substr(color,7,1) = '5') OR (substr(color,7,1) = '6') OR (substr(color,7,1) = '7') OR (substr(color,7,1) = '8') OR (substr(color,7,1) = '9') OR (substr(color,7,1) = 'A') OR (substr(color,7,1) = 'B') OR (substr(color,7,1) = 'C') OR (substr(color,7,1) = 'D') OR (substr(color,7,1) = 'E') OR (substr(color,7,1) = 'F') OR (substr(color,7,1) = 'a') OR (substr(color,7,1) = 'b') OR (substr(color,7,1) = 'c') OR (substr(color,7,1) = 'd') OR (substr(color,7,1) = 'e') OR (substr(color,7,1) = 'f') ) ) );
您可以為此使用正則表達式:
check (color is null or color ~* '^#[a-f0-9]{2}[a-f0-9]{2}[a-f0-9]{2}$')
讓我分享一下我在測試中所做的事情:
- 創建表
CREATE TABLE colors (id integer primary key, color VARCHAR(7) null);
- 添加約束
ALTER TABLE colors ADD CONSTRAINT color_hex_constraint CHECK (color is null or color ~* '^#[a-f0-9]{6}$');
- 測試
insert into colors values (1, '#ff00ff'); -- OK insert into colors values (2, null); -- OK insert into colors values (3, ''); -- ERROR insert into colors values (4, 'pg'); -- ERROR select * from colors;
- 降低
ALTER TABLE colors DROP CONSTRAINT color_hex_constraint; -- only constraint DROP TABLE colors; -- all