Postgresql

在 Postgres 的列中儲存十六進制顏色

  • January 17, 2022

我想將十六進制顏色程式碼儲存在我的 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}$')

讓我分享一下我在測試中所做的事情:

  1. 創建表
CREATE TABLE colors (id integer primary key, color VARCHAR(7) null);
  1. 添加約束
ALTER TABLE colors
ADD CONSTRAINT color_hex_constraint
CHECK (color is null or color ~* '^#[a-f0-9]{6}$');
  1. 測試
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;
  1. 降低
ALTER TABLE colors DROP CONSTRAINT color_hex_constraint; -- only constraint
DROP TABLE colors; -- all

另見:https ://www.postgresql.org/docs/9.2/sql-createtype.html

引用自:https://dba.stackexchange.com/questions/271807