2017-12-13 17 views
0

私はPostgreSQL 10.1を使用しています。PostgreSQLのCHECK制約が 'LIKE'で失敗しましたが、 '〜SIMILAR TO'やPOSIX '!〜*'で成功しました

私は、次の表を作成します。

CREATE TABLE country 
(
    id  smallint NOT NULL, 
    alpha2 character varying(2) NOT NULL, 
    alpha3 character varying(3) NOT NULL, 
    name  character varying(38) NOT NULL, 

    CONSTRAINT country_pkey PRIMARY KEY (id), 
    CONSTRAINT country_alpha2_key UNIQUE (alpha2), 
    CONSTRAINT country_alpha3_key UNIQUE (alpha3), 
    CONSTRAINT country_name_key UNIQUE (name), 
    CONSTRAINT country_alpha2_check 
     CHECK ((char_length(alpha2::text)) = 2 AND 
       (alpha2 NOT LIKE '%[^a-zA-Z]%')), 
    CONSTRAINT country_alpha3_check 
     CHECK ((char_length(alpha3::text)) = 3 AND 
       (alpha3 NOT LIKE '%[^a-zA-Z]%')), 
    CONSTRAINT country_name_check CHECK (char_length(name::text) > 0) 
); 

は残念ながら、次の文は、それはないはずですが成功します。

INSERT INTO country (id, alpha2, alpha3, name) 
    VALUES (1, '11', '111', 'Haiti'); 

私はSIMILAR TOLIKEに置き換えた場合、それが必要として、その後、上記のステートメントが失敗しました。

私がNOT LIKE '%[^a-zA-Z]%'をPOSIX Regex !~* '[^a-zA-Z]'に置き換えた場合、上記のステートメントも失敗します。

LIKEが失敗する理由はありますか?私が見た例のほとんどはLIKEを使用しています! LIKEは仕事が好きではないようです!

ティア

+2

'LIKE'は正規表現をサポートしていません:https://www.postgresql.org/docs/current/static/functions-matching.html#FUNCTIONS-LIKE –

+0

OKですが、パターンマッチングをサポートしています(9.7.1章マニュアルで)。 '%[^ a-zA-Z]%'はパターンまたは正規表現ですか? – SONewbiee

+0

Oooohhh! '%[a-zA-Z]%'に '^'文字を追加すると、パターン(%[^ a-zA-Z]%)は正規表現になります。これは説明ですか? – SONewbiee

答えて

1

説明は明らかであると単なる専門的に隠されている:

LIKE PostgreSQLのに形成するために2つのだけ文字を使用していますpattern_とパーセント記号%を強調。

関連する問題