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 TO
とLIKE
に置き換えた場合、それが必要として、その後、上記のステートメントが失敗しました。
私がNOT LIKE '%[^a-zA-Z]%'
をPOSIX Regex !~* '[^a-zA-Z]'
に置き換えた場合、上記のステートメントも失敗します。
LIKE
が失敗する理由はありますか?私が見た例のほとんどはLIKE
を使用しています! LIKEは仕事が好きではないようです!
ティア
'LIKE'は正規表現をサポートしていません:https://www.postgresql.org/docs/current/static/functions-matching.html#FUNCTIONS-LIKE –
OKですが、パターンマッチングをサポートしています(9.7.1章マニュアルで)。 '%[^ a-zA-Z]%'はパターンまたは正規表現ですか? – SONewbiee
Oooohhh! '%[a-zA-Z]%'に '^'文字を追加すると、パターン(%[^ a-zA-Z]%)は正規表現になります。これは説明ですか? – SONewbiee