2017-12-13 9 views
0

PostgreSQL 10.1을 사용하고 있습니다.'LIKE'를 사용하는 PostgreSQL CHECK 제약 조건은 실패하지만 '~와 ~ 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을에 형성 문자를 사용하는 pattern : _ 및 퍼센트 기호 %을 강조.